PKoCD6IPP commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PKoCZ README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PKoCaCVV build.xml
PKÈMDxϑ[$$manifestversion=0.2 frameworkVersions=1.2.x PKÈMD@>@>lib/play-play-file-auth.jarPK ĈMD META-INF/PK ÈMD META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK ĈMDplay/PK ĈMD play/modules/PK ĈMDplay/modules/fileauth/PK ĈMDplay/modules/fileauth/utils/PK ĈMD play.pluginsPK ĈMD)K L$play/modules/fileauth/FileAuth.classW xT_fyo^^X&3 h2DD 5 HH0b/3/t TZmnԆ(KRW*m}0IL/w9ssϝǏ0KUa+qp`U\J Es}!d (7F7bN2nQq+nSp CŝKnܣ;w|OŽOA؃C f}>)5xLL<.'D{@Se< <+ 8bU8y/(xQK ^VWUcp5 o( E-o\~cKsuo\U&pI Κf+nF:I(FZpҐhXߴhqC y&l5LV4֯nY'=ߌ V κh67)naC@p7<-tZ]fB!ַtGCɰ0ÆjrV: %aĩ=2V25zˮdjmneΞ3\uP,AOѭd6N eVϲx4#hwgztlfʣ|̸>єF,݌)c r1"-d=m"#N٤͐n1JLO$6G!ш[cZCIow ډԊY0Fh8םaRj Y5Aɦ4eF#.jX+WnqBF6,#>օ\¸a bxD֤p4ʈV9-lꛉ`wȾL2?NO9E5Sa-54a5oב\,]S6xS[xvLC,~3ojihwD~9CpxAKƏ5?e0ixC/_j:H`4#Q˟a`ʺ4!D i1[ i`j6cФn{q[!65ɉ"z,FIlSҎ/HSJp$7ޕ2s'4ӟ'~,&{c°h&rqⱟ5V.N +օy #9rrhi^|n݈`%J_FQhʖTVFnCSȹY3yِZ((M|Z'j̩w7;ɾ$nVNau̴D-i;rn1qZ;ְaav&ze9Oܚx4f-H0$%Yoӣf oknݚnޔ`27":ުF3?NXy,&8HG(b3!4H=G+B,& ~]Xش,;9_X4xu qGɑ{0 R":JjK]U UZغmdR Xs{ĻM-b/֦=](m{b8~򪪃C=m{lGp*N,Li&AgI.lD"H$h$ٞE$gsHI0$#E">LSFrT Bq.GO I5la`F?' dsf6n2N!L)LX: 0Q2@.q0q!m eւٵA8Tv`[>q`p|i%UEq8=(äVPt3p-XB6( 0t0(] ɠ\DgtA0Qs W$يpqN!=NH;4e./R46iAf_N¿J x&4҇8{H*m@eo^US`;ޅi;b70,.6>j>g/fպQsin{}n^|vsX{5;FujNns}ݍt~4YS~bla~Ua6v)lEtL\t]zpv-u؅q'nB?Gp;݌A܂9>[ 6CH-iucݴR8Iव, LKJl={#bM ( z +2K2(x#)6 .,A 1\1?M~Av~l9p\6?܃s}vQbMٍ"LO|ۆ -Zէ[蘫jwaO-f<"b ~& Sd dgϕ!-+%^( ]*M*H&4K ɳe/.#$^?(c%{/o)z-O8d P4\v/ewݽ` IlZcԶ&iW _/Lg:ӦL2t4zwkt|9y\~)M )b.qś $Š!Ĩ EH8eGo cbxXY'u I'>B"1{L O%<)4<%3>+ /1ϊ՗$|Yl" ֯9qZw#wWF@D}zB'ǢI]HJ%84=f-[ VoA=n-FD2Qŭ9$476}XKVt#x`$JEd`HJJt- Xמ6hQBȝ J"rUM$,󚰒j0@L*auV|:Faíp#;ǂj\bQؿ* R\I&O! E8P͇x~&FXpC Yĕڞ5y%aF$̥os5+-jBߗY|S[. H(Lb\}T"vh"!JrJ\%cZxN7MVy@T=Ҙ{Պr⢌qI ,(>.@vм.Lؾ*yu-7llmk߱cή=={=CV!u(<?'I=5zjl/ʸo62%4ue5.a CsP} aAݰeׄ?`>ZbCd _Mܒctx=[locz+c;Ze?%ͧ4Hconҭ|4 A/R&!3|plX0jjle[q>; v=x6Afl<7B z',KCucyqBȏ>Aiej܎Gl}= ⳱ QuczˌY mh7>,NPS;&>[xnM]F?Aی|ARWn4`Xf ; C+ C V38s,^Ynr`/Ҕbx]`f48XgRST81ɱǏ"Pq3IJ¦o{z,rK!O 8VKme$ӿ1fIjX0>:y ^:W0C/v;go:#FqK6n6Ik&/> qWN0RlcݗYۋ>ڮ//kG ][a77M7"l \~w]YGߚ]lf[b- $6<6_`֐[ qnsvnd7-Rt5[Rr4앬;!%=I8/RR!`cX[iӿ؄Y`}2FF_V,# co݆#~AMƙ%rSH:3!qxƌMGjq٩ܘk&v5J;Dj˳:gXK kiAVGh 3ʳJ9łlR9*?GPorX 6?ss{C/oHyBר7?'7~Bj6-ûӽd:*TN^&?G ZMۨv:Mt6S JIN穕.R;N;Ao.z:-eYFݖ-c餽>g9F} 0sgt]m$ s)KT^eU╅m} +X0 zv:7xeIC"b /WI#K>W]2$L32)PD**hK(*/^ @M8nȟPK ĈMDX [=+play/modules/fileauth/utils/UnixCrypt.classz |TǑ~wϛ7i!`t   ,2B:08,cN$v|8 61l&\NlNun{5OtWWW믫_?SJ7GMJ/J7.uZ(BT7=P~DijEF}{E͸)l&j*"55{+4t}'xݐ'lU5f| j>h>~C0#(~ B%D`2\R.Z]hu r-ȡZ]hu JdX JTd(ePR.R%,JT S@2E,.bA)d(eP22(@e2(rA+JʁJ zPʁJ zV,z ¹p,"ax0E7ь+\ԏPv6 (ff91`Li%5f̲a213T,fM3{٘OH0jU9}i OQ}:fcQ1 -vvݞCÁ7.[޽bE.^}ɥk֮[᲍z.ʫ6oonY0hƦ9?k)9+,Y9P5W7dO}Alޟ5ΛCgLN^pR&.dKQtkxFB̮Nxp`s6rܽG/v_AFFƶJ yK23T3hE \LеUVUNcoUNhT7 :|Eކ.:uIe:Rg=0y~վZ9SUp PIe4HUp(qB,PK %A Իp,a+=RՊbDM*5]թj ,EjSKOsia1*ZQ}CU:+ԁCmU\t|W,Q5tM2ds),{?Cig(uP)NWYf,HѺYn7Ά[AcR@DgePCmx*ck4htq$ul$_s#)Q5@^i+N̳5u*Q& >muҩ$*HIؑox*ܑ.:)sߪ9+iN33E'&^ 'S^l"<>ٙJ':` J=WePݪ"OJxΣ*rHXCB*4AqUhN٥TrMlxܶOL6N0Hq[NҲq+JC$201nC);u.Fc>LtѦK0٤'?gӆHZ>B=iay>< !ĤX@$\/>A~08a9GEgƝ4Ij&[T\-)%O-h,&ծZEM]J Cm|Z tQ\Tdo4P#=V/Kԗ V}OW/e:zMJ}J?6GZQZEHf&a4ttCҬR\ LP4(YhI<1'T}Jb*qC&$Z13zj;aZ $w=3jpʬ+jtl(FeTr3H22ulMp(N\Ut@ޑLQTftIRu'ߙp҉pZaәR&/%|v: ʝi3ADDy'’px9#87BֳPbe8 'ÁdTe-(zڹGiLOy7J9vrFʩ~P*z+S}^uVMTz'mޭޭTQSKyT/V]u;eyV?ߩ;y"hZv~_KWJ&F\$~c64Y [9BlRX%q.N.xםPUi5^W Vu*Y杆@@cM?Ռtc>H? 1| nk8 M;ʓ99qM­'GTU}…b6LtQ>5b#d:QJa|%|,&[zDm D Q]r@<MZw &1ͽ%լDy(>@#snvUZujR*qMڢj^j; N%\clp$`/)6MN'3/+L+m5Uv! ;p+\:װXg\:vv;f wZ‚#i wvam$69;pm&-Cv>z'GbQp̶m7v$.%|;hXaM=Nϥ?E ?Mc@ P (zTe=rLzGO=B+ܸ'qdG=yW"Qf9mERyW#kUېU6dw-EVyۑU^ہ H+o'ۅvD#8gH$ L^&a$ =#g`Sp=S00 75I$$`2 72 &x$3 71 LL$p pII8$Ix'p.&L{2 c$|I !&v&&LG2 w2 w1 cfaecg`d>N$ϑ G@àL'OQ&&LL_01 Y&L1&q& &8` g{ p x 8|  ,p x x "%&/b &LWe| ;&&L3`-&b| .=" t^|Y9 ^$ @A\AZĉWÏCR "wO8^fyxy)3ÿ,;*KfW¯0 e~,YxYxYf2 ,Yofe`Nbsk̏f_c~ט }5։E>b_c#_k䭾Vkfk松vזh G-H BM>+bc=F|={G||@LAq|kgqkD'};|>ki_cßk3|-?#sgW{,_c[l_085Y_PkNuƳG_,05}Phs$- kKVaMXk:Nam%-֖ k am%- AD;g׫8W{]DT[#ĭⰳXyHaw=wj܉k kMZvvvv_H"mҮή&mήzYpC8+g;]j~!:!m6 !!mv6,iBژ_HH-q!ن|}PFa H\ˁam\XIXn&9H"vHUIw q q-ĽG{>!Br83P܇ۙc܇9lٸSV0w0w01anaa^a>a~aaAaCaaa'O sGGO sWɟ9>N S@O DOy6>& gw\!x焸8 vRxñ"o_ޞp@H3)9y-._޾$PwWB_ qeܗq8H4ijF5!G q8\,B7o q8f,g3BܷV q#}w'U^|=0H`g qJ$,b* #,HX? 8t?_EE!GB⏅ė%!)T)WDtw f, FWsE#+jjgng'4IΉҡY-(/1,Bt9%*m\xx:%{Z$"~(W^B:;w8EqB*v__H(XfD%œ~X!p0L\ VNJsRulr7fL.Cј-sؐ\ ZSF%p+4&*'B3₰S瘤a\Z[&;’Y?r{5_CHKΨ_$/_KB1[ɧ A^~'s\ʱUPw`5'fqPHׅI!)F8Ҟ3x0ֈ3WNk >}4JMb6'Kͬ" B"\Tz]R5ITN~컗dыI0\WߗGa꿅DcDŽ)ɾW‹'~PzC#ӤB]8)NxEBd3o5fI\5jtsr*ş\F$ 9~Y- p#]"q6.vNw)}؉wȾ>2| P|eeWK ܙR [|]q'gV=X`I1Zq*雒X2-|li8LW-fI ~6[#nJYVor+.F$VscΧ-K^\$%*D#Ry% aԊ7!< +-e L(.t nq6| ~37Ӹ-'B%[)VMlzHL֭f,nauCQpckXsod7M2ǒ,if~ 9<{X^­Ƒfɦs/U$ W75FJX ߀шo+%Ȋ)\v>(~$btsZaop [8qpD>enmP-*$ `t#JVbuB1qX}׈$gtlQt\ ü<"qXd XBNyP92RF+/~FH+Q(N(נQLpE\B*\:c'}Сұ J1[n9z;#pLiC9J:uV F5FNg-q^(bx,v[eD]J-ca>>***Ҳ}} play-file-auth 0.2 require: - play - play -> securePKoC;U conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPKoCsrc/play.pluginsPKoC6&src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PKMDDtt'src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; import play.modules.fileauth.utils.UnixCrypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { Logger.warn("encryptedPass is NULL for user " + user); return false; } if (encryptedPass.startsWith("$") && MD5Crypt.verifyPassword(password, encryptedPass)) { return true; } if(encryptedPass.length() == 13 && UnixCrypt.matches(encryptedPass, password)){ return true; } Logger.warn("could not validate user " + user); return false; } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (!file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PKoC4^-src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PKMDk*00-src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { return false; } } } PKMD+<|ćOO.src/play/modules/fileauth/utils/UnixCrypt.javapackage play.modules.fileauth.utils; /** * Copyright c 2005-2012. Licensed under GNU LESSER General Public License, * Version 3. http://www.gnu.org/licenses */ import java.util.Random; public class UnixCrypt { private UnixCrypt() { } private static int byteToUnsigned(byte b) { int value = b; return value < 0 ? value + 256 : value; } private static int fourBytesToInt(byte b[], int offset) { int value = byteToUnsigned(b[offset++]); value |= byteToUnsigned(b[offset++]) << 8; value |= byteToUnsigned(b[offset++]) << 16; value |= byteToUnsigned(b[offset++]) << 24; return value; } private static void intToFourBytes(int iValue, byte b[], int offset) { b[offset++] = (byte) (iValue & 0xff); b[offset++] = (byte) (iValue >>> 8 & 0xff); b[offset++] = (byte) (iValue >>> 16 & 0xff); b[offset++] = (byte) (iValue >>> 24 & 0xff); } private static void PERM_OP(int a, int b, int n, int m, int results[]) { int t = (a >>> n ^ b) & m; a ^= t << n; b ^= t; results[0] = a; results[1] = b; } private static int HPERM_OP(int a, int n, int m) { int t = (a << 16 - n ^ a) & m; a = a ^ t ^ t >>> 16 - n; return a; } private static int[] des_set_key(byte key[]) { int schedule[] = new int[32]; int c = fourBytesToInt(key, 0); int d = fourBytesToInt(key, 4); int results[] = new int[2]; PERM_OP(d, c, 4, 0xf0f0f0f, results); d = results[0]; c = results[1]; c = HPERM_OP(c, -2, 0xcccc0000); d = HPERM_OP(d, -2, 0xcccc0000); PERM_OP(d, c, 1, 0x55555555, results); d = results[0]; c = results[1]; PERM_OP(c, d, 8, 0xff00ff, results); c = results[0]; d = results[1]; PERM_OP(d, c, 1, 0x55555555, results); d = results[0]; c = results[1]; d = (d & 0xff) << 16 | d & 0xff00 | (d & 0xff0000) >>> 16 | (c & 0xf0000000) >>> 4; c &= 0xfffffff; int j = 0; for (int i = 0; i < 16; i++) { if (shifts2[i]) { c = c >>> 2 | c << 26; d = d >>> 2 | d << 26; } else { c = c >>> 1 | c << 27; d = d >>> 1 | d << 27; } c &= 0xfffffff; d &= 0xfffffff; int s = skb[0][c & 0x3f] | skb[1][c >>> 6 & 3 | c >>> 7 & 0x3c] | skb[2][c >>> 13 & 0xf | c >>> 14 & 0x30] | skb[3][c >>> 20 & 1 | c >>> 21 & 6 | c >>> 22 & 0x38]; int t = skb[4][d & 0x3f] | skb[5][d >>> 7 & 3 | d >>> 8 & 0x3c] | skb[6][d >>> 15 & 0x3f] | skb[7][d >>> 21 & 0xf | d >>> 22 & 0x30]; schedule[j++] = (t << 16 | s & 0xffff) & -1; s = s >>> 16 | t & 0xffff0000; s = s << 4 | s >>> 28; schedule[j++] = s & -1; } return schedule; } private static int D_ENCRYPT(int L, int R, int S, int E0, int E1, int s[]) { int v = R ^ R >>> 16; int u = v & E0; v &= E1; u = u ^ u << 16 ^ R ^ s[S]; int t = v ^ v << 16 ^ R ^ s[S + 1]; t = t >>> 4 | t << 28; L ^= SPtrans[1][t & 0x3f] | SPtrans[3][t >>> 8 & 0x3f] | SPtrans[5][t >>> 16 & 0x3f] | SPtrans[7][t >>> 24 & 0x3f] | SPtrans[0][u & 0x3f] | SPtrans[2][u >>> 8 & 0x3f] | SPtrans[4][u >>> 16 & 0x3f] | SPtrans[6][u >>> 24 & 0x3f]; return L; } private static int[] body(int schedule[], int Eswap0, int Eswap1) { int left = 0; int right = 0; int t; for (int j = 0; j < 25; j++) { for (int i = 0; i < 32; i += 4) { left = D_ENCRYPT(left, right, i, Eswap0, Eswap1, schedule); right = D_ENCRYPT(right, left, i + 2, Eswap0, Eswap1, schedule); } t = left; left = right; right = t; } t = right; right = left >>> 1 | left << 31; left = t >>> 1 | t << 31; left &= -1; right &= -1; int results[] = new int[2]; PERM_OP(right, left, 1, 0x55555555, results); right = results[0]; left = results[1]; PERM_OP(left, right, 8, 0xff00ff, results); left = results[0]; right = results[1]; PERM_OP(right, left, 2, 0x33333333, results); right = results[0]; left = results[1]; PERM_OP(left, right, 16, 65535, results); left = results[0]; right = results[1]; PERM_OP(right, left, 4, 0xf0f0f0f, results); right = results[0]; left = results[1]; int out[] = new int[2]; out[0] = left; out[1] = right; return out; } public static final String crypt(String salt, String original) { for (; salt.length() < 2; salt = salt + "A"); StringBuilder buffer = new StringBuilder(" "); char charZero = salt.charAt(0); char charOne = salt.charAt(1); buffer.setCharAt(0, charZero); buffer.setCharAt(1, charOne); int Eswap0 = con_salt[charZero]; int Eswap1 = con_salt[charOne] << 4; byte key[] = new byte[8]; for (int i = 0; i < key.length; i++) { key[i] = 0; } for (int i = 0; i < key.length && i < original.length(); i++) { int iChar = original.charAt(i); key[i] = (byte) (iChar << 1); } int schedule[] = des_set_key(key); int out[] = body(schedule, Eswap0, Eswap1); byte b[] = new byte[9]; intToFourBytes(out[0], b, 0); intToFourBytes(out[1], b, 4); b[8] = 0; int i = 2; int y = 0; int u = 128; for (; i < 13; i++) { int j = 0; int c = 0; for (; j < 6; j++) { c <<= 1; if ((b[y] & u) != 0) { c |= 1; } u >>>= 1; if (u == 0) { y++; u = 128; } buffer.setCharAt(i, (char) cov_2char[c]); } } return buffer.toString(); } public static final String crypt(String original) { Random randomGenerator = new Random(); int numSaltChars = saltChars.length; String salt = "" + saltChars[Math.abs(randomGenerator.nextInt()) % numSaltChars] + saltChars[Math.abs(randomGenerator.nextInt()) % numSaltChars]; return crypt(salt, original); } public static final boolean matches(String encryptedPassword, String enteredPassword) { String salt = encryptedPassword.substring(0, 3); String newCrypt = crypt(salt, enteredPassword); return newCrypt.equals(encryptedPassword); } private static final char saltChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./" .toCharArray(); // private static final int ITERATIONS = 16; private static final int con_salt[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0, 0}; private static final boolean shifts2[] = {false, false, true, true, true, true, true, true, false, true, true, true, true, true, true, false}; private static final int skb[][] = { {0, 16, 0x20000000, 0x20000010, 0x10000, 0x10010, 0x20010000, 0x20010010, 2048, 2064, 0x20000800, 0x20000810, 0x10800, 0x10810, 0x20010800, 0x20010810, 32, 48, 0x20000020, 0x20000030, 0x10020, 0x10030, 0x20010020, 0x20010030, 2080, 2096, 0x20000820, 0x20000830, 0x10820, 0x10830, 0x20010820, 0x20010830, 0x80000, 0x80010, 0x20080000, 0x20080010, 0x90000, 0x90010, 0x20090000, 0x20090010, 0x80800, 0x80810, 0x20080800, 0x20080810, 0x90800, 0x90810, 0x20090800, 0x20090810, 0x80020, 0x80030, 0x20080020, 0x20080030, 0x90020, 0x90030, 0x20090020, 0x20090030, 0x80820, 0x80830, 0x20080820, 0x20080830, 0x90820, 0x90830, 0x20090820, 0x20090830}, {0, 0x2000000, 8192, 0x2002000, 0x200000, 0x2200000, 0x202000, 0x2202000, 4, 0x2000004, 8196, 0x2002004, 0x200004, 0x2200004, 0x202004, 0x2202004, 1024, 0x2000400, 9216, 0x2002400, 0x200400, 0x2200400, 0x202400, 0x2202400, 1028, 0x2000404, 9220, 0x2002404, 0x200404, 0x2200404, 0x202404, 0x2202404, 0x10000000, 0x12000000, 0x10002000, 0x12002000, 0x10200000, 0x12200000, 0x10202000, 0x12202000, 0x10000004, 0x12000004, 0x10002004, 0x12002004, 0x10200004, 0x12200004, 0x10202004, 0x12202004, 0x10000400, 0x12000400, 0x10002400, 0x12002400, 0x10200400, 0x12200400, 0x10202400, 0x12202400, 0x10000404, 0x12000404, 0x10002404, 0x12002404, 0x10200404, 0x12200404, 0x10202404, 0x12202404}, {0, 1, 0x40000, 0x40001, 0x1000000, 0x1000001, 0x1040000, 0x1040001, 2, 3, 0x40002, 0x40003, 0x1000002, 0x1000003, 0x1040002, 0x1040003, 512, 513, 0x40200, 0x40201, 0x1000200, 0x1000201, 0x1040200, 0x1040201, 514, 515, 0x40202, 0x40203, 0x1000202, 0x1000203, 0x1040202, 0x1040203, 0x8000000, 0x8000001, 0x8040000, 0x8040001, 0x9000000, 0x9000001, 0x9040000, 0x9040001, 0x8000002, 0x8000003, 0x8040002, 0x8040003, 0x9000002, 0x9000003, 0x9040002, 0x9040003, 0x8000200, 0x8000201, 0x8040200, 0x8040201, 0x9000200, 0x9000201, 0x9040200, 0x9040201, 0x8000202, 0x8000203, 0x8040202, 0x8040203, 0x9000202, 0x9000203, 0x9040202, 0x9040203}, {0, 0x100000, 256, 0x100100, 8, 0x100008, 264, 0x100108, 4096, 0x101000, 4352, 0x101100, 4104, 0x101008, 4360, 0x101108, 0x4000000, 0x4100000, 0x4000100, 0x4100100, 0x4000008, 0x4100008, 0x4000108, 0x4100108, 0x4001000, 0x4101000, 0x4001100, 0x4101100, 0x4001008, 0x4101008, 0x4001108, 0x4101108, 0x20000, 0x120000, 0x20100, 0x120100, 0x20008, 0x120008, 0x20108, 0x120108, 0x21000, 0x121000, 0x21100, 0x121100, 0x21008, 0x121008, 0x21108, 0x121108, 0x4020000, 0x4120000, 0x4020100, 0x4120100, 0x4020008, 0x4120008, 0x4020108, 0x4120108, 0x4021000, 0x4121000, 0x4021100, 0x4121100, 0x4021008, 0x4121008, 0x4021108, 0x4121108}, {0, 0x10000000, 0x10000, 0x10010000, 4, 0x10000004, 0x10004, 0x10010004, 0x20000000, 0x30000000, 0x20010000, 0x30010000, 0x20000004, 0x30000004, 0x20010004, 0x30010004, 0x100000, 0x10100000, 0x110000, 0x10110000, 0x100004, 0x10100004, 0x110004, 0x10110004, 0x20100000, 0x30100000, 0x20110000, 0x30110000, 0x20100004, 0x30100004, 0x20110004, 0x30110004, 4096, 0x10001000, 0x11000, 0x10011000, 4100, 0x10001004, 0x11004, 0x10011004, 0x20001000, 0x30001000, 0x20011000, 0x30011000, 0x20001004, 0x30001004, 0x20011004, 0x30011004, 0x101000, 0x10101000, 0x111000, 0x10111000, 0x101004, 0x10101004, 0x111004, 0x10111004, 0x20101000, 0x30101000, 0x20111000, 0x30111000, 0x20101004, 0x30101004, 0x20111004, 0x30111004}, {0, 0x8000000, 8, 0x8000008, 1024, 0x8000400, 1032, 0x8000408, 0x20000, 0x8020000, 0x20008, 0x8020008, 0x20400, 0x8020400, 0x20408, 0x8020408, 1, 0x8000001, 9, 0x8000009, 1025, 0x8000401, 1033, 0x8000409, 0x20001, 0x8020001, 0x20009, 0x8020009, 0x20401, 0x8020401, 0x20409, 0x8020409, 0x2000000, 0xa000000, 0x2000008, 0xa000008, 0x2000400, 0xa000400, 0x2000408, 0xa000408, 0x2020000, 0xa020000, 0x2020008, 0xa020008, 0x2020400, 0xa020400, 0x2020408, 0xa020408, 0x2000001, 0xa000001, 0x2000009, 0xa000009, 0x2000401, 0xa000401, 0x2000409, 0xa000409, 0x2020001, 0xa020001, 0x2020009, 0xa020009, 0x2020401, 0xa020401, 0x2020409, 0xa020409}, {0, 256, 0x80000, 0x80100, 0x1000000, 0x1000100, 0x1080000, 0x1080100, 16, 272, 0x80010, 0x80110, 0x1000010, 0x1000110, 0x1080010, 0x1080110, 0x200000, 0x200100, 0x280000, 0x280100, 0x1200000, 0x1200100, 0x1280000, 0x1280100, 0x200010, 0x200110, 0x280010, 0x280110, 0x1200010, 0x1200110, 0x1280010, 0x1280110, 512, 768, 0x80200, 0x80300, 0x1000200, 0x1000300, 0x1080200, 0x1080300, 528, 784, 0x80210, 0x80310, 0x1000210, 0x1000310, 0x1080210, 0x1080310, 0x200200, 0x200300, 0x280200, 0x280300, 0x1200200, 0x1200300, 0x1280200, 0x1280300, 0x200210, 0x200310, 0x280210, 0x280310, 0x1200210, 0x1200310, 0x1280210, 0x1280310}, {0, 0x4000000, 0x40000, 0x4040000, 2, 0x4000002, 0x40002, 0x4040002, 8192, 0x4002000, 0x42000, 0x4042000, 8194, 0x4002002, 0x42002, 0x4042002, 32, 0x4000020, 0x40020, 0x4040020, 34, 0x4000022, 0x40022, 0x4040022, 8224, 0x4002020, 0x42020, 0x4042020, 8226, 0x4002022, 0x42022, 0x4042022, 2048, 0x4000800, 0x40800, 0x4040800, 2050, 0x4000802, 0x40802, 0x4040802, 10240, 0x4002800, 0x42800, 0x4042800, 10242, 0x4002802, 0x42802, 0x4042802, 2080, 0x4000820, 0x40820, 0x4040820, 2082, 0x4000822, 0x40822, 0x4040822, 10272, 0x4002820, 0x42820, 0x4042820, 10274, 0x4002822, 0x42822, 0x4042822}}; private static final int SPtrans[][] = { {0x820200, 0x20000, 0x80800000, 0x80820200, 0x800000, 0x80020200, 0x80020000, 0x80800000, 0x80020200, 0x820200, 0x820000, 0x80000200, 0x80800200, 0x800000, 0, 0x80020000, 0x20000, 0x80000000, 0x800200, 0x20200, 0x80820200, 0x820000, 0x80000200, 0x800200, 0x80000000, 512, 0x20200, 0x80820000, 512, 0x80800200, 0x80820000, 0, 0, 0x80820200, 0x800200, 0x80020000, 0x820200, 0x20000, 0x80000200, 0x800200, 0x80820000, 512, 0x20200, 0x80800000, 0x80020200, 0x80000000, 0x80800000, 0x820000, 0x80820200, 0x20200, 0x820000, 0x80800200, 0x800000, 0x80000200, 0x80020000, 0, 0x20000, 0x800000, 0x80800200, 0x820200, 0x80000000, 0x80820000, 512, 0x80020200}, {0x10042004, 0, 0x42000, 0x10040000, 0x10000004, 8196, 0x10002000, 0x42000, 8192, 0x10040004, 4, 0x10002000, 0x40004, 0x10042000, 0x10040000, 4, 0x40000, 0x10002004, 0x10040004, 8192, 0x42004, 0x10000000, 0, 0x40004, 0x10002004, 0x42004, 0x10042000, 0x10000004, 0x10000000, 0x40000, 8196, 0x10042004, 0x40004, 0x10042000, 0x10002000, 0x42004, 0x10042004, 0x40004, 0x10000004, 0, 0x10000000, 8196, 0x40000, 0x10040004, 8192, 0x10000000, 0x42004, 0x10002004, 0x10042000, 8192, 0, 0x10000004, 4, 0x10042004, 0x42000, 0x10040000, 0x10040004, 0x40000, 8196, 0x10002000, 0x10002004, 4, 0x10040000, 0x42000}, {0x41000000, 0x1010040, 64, 0x41000040, 0x40010000, 0x1000000, 0x41000040, 0x10040, 0x1000040, 0x10000, 0x1010000, 0x40000000, 0x41010040, 0x40000040, 0x40000000, 0x41010000, 0, 0x40010000, 0x1010040, 64, 0x40000040, 0x41010040, 0x10000, 0x41000000, 0x41010000, 0x1000040, 0x40010040, 0x1010000, 0x10040, 0, 0x1000000, 0x40010040, 0x1010040, 64, 0x40000000, 0x10000, 0x40000040, 0x40010000, 0x1010000, 0x41000040, 0, 0x1010040, 0x10040, 0x41010000, 0x40010000, 0x1000000, 0x41010040, 0x40000000, 0x40010040, 0x41000000, 0x1000000, 0x41010040, 0x10000, 0x1000040, 0x41000040, 0x10040, 0x1000040, 0, 0x41010000, 0x40000040, 0x41000000, 0x40010040, 64, 0x1010000}, {0x100402, 0x4000400, 2, 0x4100402, 0, 0x4100000, 0x4000402, 0x100002, 0x4100400, 0x4000002, 0x4000000, 1026, 0x4000002, 0x100402, 0x100000, 0x4000000, 0x4100002, 0x100400, 1024, 2, 0x100400, 0x4000402, 0x4100000, 1024, 1026, 0, 0x100002, 0x4100400, 0x4000400, 0x4100002, 0x4100402, 0x100000, 0x4100002, 1026, 0x100000, 0x4000002, 0x100400, 0x4000400, 2, 0x4100000, 0x4000402, 0, 1024, 0x100002, 0, 0x4100002, 0x4100400, 1024, 0x4000000, 0x4100402, 0x100402, 0x100000, 0x4100402, 2, 0x4000400, 0x100402, 0x100002, 0x100400, 0x4100000, 0x4000402, 1026, 0x4000000, 0x4000002, 0x4100400}, {0x2000000, 16384, 256, 0x2004108, 0x2004008, 0x2000100, 16648, 0x2004000, 16384, 8, 0x2000008, 16640, 0x2000108, 0x2004008, 0x2004100, 0, 16640, 0x2000000, 16392, 264, 0x2000100, 16648, 0, 0x2000008, 8, 0x2000108, 0x2004108, 16392, 0x2004000, 256, 264, 0x2004100, 0x2004100, 0x2000108, 16392, 0x2004000, 16384, 8, 0x2000008, 0x2000100, 0x2000000, 16640, 0x2004108, 0, 16648, 0x2000000, 256, 16392, 0x2000108, 256, 0, 0x2004108, 0x2004008, 0x2004100, 264, 16384, 16640, 0x2004008, 0x2000100, 264, 8, 16648, 0x2004000, 0x2000008}, {0x20000010, 0x80010, 0, 0x20080800, 0x80010, 2048, 0x20000810, 0x80000, 2064, 0x20080810, 0x80800, 0x20000000, 0x20000800, 0x20000010, 0x20080000, 0x80810, 0x80000, 0x20000810, 0x20080010, 0, 2048, 16, 0x20080800, 0x20080010, 0x20080810, 0x20080000, 0x20000000, 2064, 16, 0x80800, 0x80810, 0x20000800, 2064, 0x20000000, 0x20000800, 0x80810, 0x20080800, 0x80010, 0, 0x20000800, 0x20000000, 2048, 0x20080010, 0x80000, 0x80010, 0x20080810, 0x80800, 16, 0x20080810, 0x80800, 0x80000, 0x20000810, 0x20000010, 0x20080000, 0x80810, 0, 2048, 0x20000010, 0x20000810, 0x20080800, 0x20080000, 2064, 16, 0x20080010}, {4096, 128, 0x400080, 0x400001, 0x401081, 4097, 4224, 0, 0x400000, 0x400081, 129, 0x401000, 1, 0x401080, 0x401000, 129, 0x400081, 4096, 4097, 0x401081, 0, 0x400080, 0x400001, 4224, 0x401001, 4225, 0x401080, 1, 4225, 0x401001, 128, 0x400000, 4225, 0x401000, 0x401001, 129, 4096, 128, 0x400000, 0x401001, 0x400081, 4225, 4224, 0, 128, 0x400001, 1, 0x400080, 0, 0x400081, 0x400080, 4224, 129, 4096, 0x401081, 0x400000, 0x401080, 1, 4097, 0x401081, 0x400001, 0x401080, 0x401000, 4097}, {0x8200020, 0x8208000, 32800, 0, 0x8008000, 0x200020, 0x8200000, 0x8208020, 32, 0x8000000, 0x208000, 32800, 0x208020, 0x8008020, 0x8000020, 0x8200000, 32768, 0x208020, 0x200020, 0x8008000, 0x8208020, 0x8000020, 0, 0x208000, 0x8000000, 0x200000, 0x8008020, 0x8200020, 0x200000, 32768, 0x8208000, 32, 0x200000, 32768, 0x8000020, 0x8208020, 32800, 0x8000000, 0, 0x208000, 0x8200020, 0x8008020, 0x8008000, 0x200020, 0x8208000, 32, 0x200020, 0x8008000, 0x8208020, 0x200000, 0x8200000, 0x8000020, 0x208000, 32800, 0x8008020, 0x8200000, 32, 0x8208000, 0x208020, 0, 0x8000000, 0x8200020, 32768, 0x208020}}; private static final int cov_2char[] = {46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122}; } PKą9D*F>>javadoc/package-listcontrollers play.modules.fileauth play.modules.fileauth.utils PKą9D*xjavadoc/overview-tree.html Class Hierarchy

Hierarchy For All Packages

Package Hierarchies:
controllers, play.modules.fileauth, play.modules.fileauth.utils

Class Hierarchy

  • java.lang.Object
    • play.mvc.Controller (implements play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport)
    • play.modules.fileauth.FileAuth
    • play.Invoker.Invocation (implements java.lang.Runnable)
      • play.jobs.Job<V> (implements java.util.concurrent.Callable<V>)
    • play.modules.fileauth.utils.MD5Crypt
    • play.PlayPlugin (implements java.lang.Comparable<T>)

Annotation Type Hierarchy

  • controllers.Check (implements java.lang.annotation.Annotation)


PKą9Dlnnjavadoc/allclasses-noframe.html All Classes All Classes
AuthFileSecurity
Check
FileAuth
FileAuthPlugin
MD5Crypt
ScanJob
Secure
Secure.Security
PKą9D?Moojavadoc/stylesheet.css/* Javadoc style sheet */ /* Define colors, fonts and other style attributes here to override the defaults */ /* Page background color */ body { background-color: #FFFFFF; color:#000000 } /* Headings */ h1 { font-size: 145% } /* Table colors */ .TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ .TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ .TableRowColor { background: #FFFFFF; color:#000000 } /* White */ /* Font used in left-hand frame lists */ .FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } .FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } .FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } /* Navigation bar fonts and colors */ .NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ .NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ .NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} .NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} .NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} .NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} PKą9DY##javadoc/help-doc.html API Help

How This API Document Is Organized

This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

Overview

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

Package

Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types

Class/Interface

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary

  • Field Detail
  • Constructor Detail
  • Method Detail
Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

Annotation Type

Each annotation type has its own separate page with the following sections:

  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail

Enum

Each enum has its own separate page with the following sections:

  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail

Tree (Class Hierarchy)

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.

Deprecated API

The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

Index

The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

Prev/Next

These links take you to the next or previous class, interface, package, or related page.

Frames/No Frames

These links show and hide the HTML frames. All pages are available with or without frames.

Serialized Form

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

Constant Field Values

The Constant Field Values page lists the static final fields and their values.

This help file applies to API documentation generated using the standard doclet.



PKą9D-vDjavadoc/allclasses-frame.html All Classes All Classes
AuthFileSecurity
Check
FileAuth
FileAuthPlugin
MD5Crypt
ScanJob
Secure
Secure.Security
PKą9DU>javadoc/constant-values.html Constant Field Values

Constant Field Values


Contents
play.modules.*

play.modules.fileauth.FileAuth
public static final java.lang.String AUTH_FILE_GROUPS_CACHE_KEY "AUTH_FILE_GROUPS"
public static final java.lang.String AUTH_FILE_USERS_CACHE_KEY "AUTH_FILE_USERS"

play.modules.fileauth.utils.MD5Crypt
public static final java.lang.String itoa64 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
public static final java.lang.String SALTCHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"



PKą9D*Tjavadoc/overview-frame.html Overview List
All Classes

Packages
controllers
play.modules.fileauth
play.modules.fileauth.utils

  PKą9DqXvJvJjavadoc/index-all.html Index


A B C D F G I L M O P S T V

A

apacheCrypt(String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
apacheCrypt(String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
AUTH_FILE_GROUPS_CACHE_KEY - Static variable in class play.modules.fileauth.FileAuth
 
AUTH_FILE_USERS_CACHE_KEY - Static variable in class play.modules.fileauth.FileAuth
 
authenticate(String, String, boolean) - Static method in class controllers.Secure
 
authentify(String, String) - Static method in class controllers.AuthFileSecurity
Authentify an user against the given AuthFile.
AuthFileSecurity - Class in controllers
This Class provides basice Security Functions for the Play! Security Plugin.
AuthFileSecurity() - Constructor for class controllers.AuthFileSecurity
 

B

bytes2u(byte) - Static method in class play.modules.fileauth.utils.MD5Crypt
convert an encoded unsigned byte value into a int with the unsigned value.

C

check(String) - Static method in class controllers.AuthFileSecurity
Checks if the current user (that is loged in) has the profile (e.g.
Check - Annotation Type in controllers
 
clearbits(byte[]) - Static method in class play.modules.fileauth.utils.MD5Crypt
 
contains(String, String) - Static method in class play.modules.fileauth.FileAuth
Checks if a group contains a given username.
controllers - package controllers
 
crypt(String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
crypt(String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
crypt(String, String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates md5-encoded password hash from a plaintext password, a salt, and a magic string.

D

doJob() - Method in class play.modules.fileauth.ScanJob
 

F

FileAuth - Class in play.modules.fileauth
Basic Wrapper for all FileAuth Functions.
FileAuth() - Constructor for class play.modules.fileauth.FileAuth
 
FileAuthPlugin - Class in play.modules.fileauth
Entry Class for first file scan.
FileAuthPlugin() - Constructor for class play.modules.fileauth.FileAuthPlugin
 

G

getGroups() - Static method in class play.modules.fileauth.FileAuth
Returns a Map of all Groups (groups/usernames).
getUsers() - Static method in class play.modules.fileauth.FileAuth
Returns a Map of all Users (user/password hash).

I

IS_ENABLED - Static variable in class play.modules.fileauth.FileAuth
 
itoa64 - Static variable in class play.modules.fileauth.utils.MD5Crypt
 

L

login() - Static method in class controllers.Secure
 
logout() - Static method in class controllers.Secure
 

M

main(String[]) - Static method in class play.modules.fileauth.utils.MD5Crypt
Command line test rig.
MD5Crypt - Class in play.modules.fileauth.utils
This class defines a method, crypt(), which takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible md5-encoded password entry.
MD5Crypt() - Constructor for class play.modules.fileauth.utils.MD5Crypt
 

O

onApplicationStart() - Method in class play.modules.fileauth.FileAuthPlugin
Trigger to scan the files for the first Time.

P

play.modules.fileauth - package play.modules.fileauth
 
play.modules.fileauth.utils - package play.modules.fileauth.utils
 

S

SALTCHARS - Static variable in class play.modules.fileauth.utils.MD5Crypt
 
scanGroups() - Static method in class play.modules.fileauth.FileAuth
Rescans the groups file.
ScanJob - Class in play.modules.fileauth
Periodically Scan of user/group files.
ScanJob() - Constructor for class play.modules.fileauth.ScanJob
 
scanUsers() - Static method in class play.modules.fileauth.FileAuth
Rescans the users file.
Secure - Class in controllers
 
Secure() - Constructor for class controllers.Secure
 
Secure.Security - Class in controllers
 
Secure.Security() - Constructor for class controllers.Secure.Security
 

T

to64(long, int) - Static method in class play.modules.fileauth.utils.MD5Crypt
 

V

validate(String, String) - Static method in class play.modules.fileauth.FileAuth
Validates an user with a given password agains the user/password hash mapping.
verifyPassword(String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method tests a plaintext password against a md5Crypt'ed hash and returns true if the password matches the hash.

A B C D F G I L M O P S T V

PKą9D֦pjavadoc/index.html Generated Documentation (Untitled) <H2> Frame Alert</H2> <P> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR> Link to<A HREF="overview-summary.html">Non-frame version.</A> PKą9Dejavadoc/overview-summary.html Overview

Packages
controllers  
play.modules.fileauth  
play.modules.fileauth.utils  

 



PKą9D7javadoc/deprecated-list.html Deprecated List

Deprecated API


Contents


PKą9DM99javadoc/resources/inherit.gifGIF89a, DrjԐ;߀Q@N;PKÅ9DڰN??+javadoc/play/modules/fileauth/FileAuth.html FileAuth

play.modules.fileauth
Class FileAuth

java.lang.Object
  extended by play.modules.fileauth.FileAuth

public class FileAuth
extends java.lang.Object

Basic Wrapper for all FileAuth Functions.


Field Summary
static java.lang.String AUTH_FILE_GROUPS_CACHE_KEY
           
static java.lang.String AUTH_FILE_USERS_CACHE_KEY
           
static boolean IS_ENABLED
           
 
Constructor Summary
FileAuth()
           
 
Method Summary
static boolean contains(java.lang.String group, java.lang.String user)
          Checks if a group contains a given username.
static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getGroups()
          Returns a Map of all Groups (groups/usernames).
static java.util.Map<java.lang.String,java.lang.String> getUsers()
          Returns a Map of all Users (user/password hash).
static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> scanGroups()
          Rescans the groups file.
static java.util.Map<java.lang.String,java.lang.String> scanUsers()
          Rescans the users file.
static boolean validate(java.lang.String user, java.lang.String password)
          Validates an user with a given password agains the user/password hash mapping.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

AUTH_FILE_USERS_CACHE_KEY

public static final java.lang.String AUTH_FILE_USERS_CACHE_KEY
See Also:
Constant Field Values

IS_ENABLED

public static final boolean IS_ENABLED

AUTH_FILE_GROUPS_CACHE_KEY

public static final java.lang.String AUTH_FILE_GROUPS_CACHE_KEY
See Also:
Constant Field Values
Constructor Detail

FileAuth

public FileAuth()
Method Detail

getUsers

public static java.util.Map<java.lang.String,java.lang.String> getUsers()
Returns a Map of all Users (user/password hash).

Returns:
the Map.

getGroups

public static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getGroups()
Returns a Map of all Groups (groups/usernames).

Returns:
the Map.

contains

public static boolean contains(java.lang.String group,
                               java.lang.String user)
Checks if a group contains a given username.

Parameters:
group - the Group to check.
user - the user to check.
Returns:
true if user is in group, otherwise false.

validate

public static boolean validate(java.lang.String user,
                               java.lang.String password)
Validates an user with a given password agains the user/password hash mapping.

Parameters:
user - the given user.
password - the given password (clear text).
Returns:
true if validation okay, otherwise false.

scanUsers

public static java.util.Map<java.lang.String,java.lang.String> scanUsers()
Rescans the users file.

Returns:
the updated Map of users.

scanGroups

public static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> scanGroups()
Rescans the groups file.

Returns:
the updated Map of groups.


PKą9D<8/javadoc/play/modules/fileauth/package-tree.html play.modules.fileauth Class Hierarchy

Hierarchy For Package play.modules.fileauth

Package Hierarchies:
All Packages

Class Hierarchy

  • java.lang.Object
    • play.modules.fileauth.FileAuth
    • play.Invoker.Invocation (implements java.lang.Runnable)
      • play.jobs.Job<V> (implements java.util.concurrent.Callable<V>)
    • play.PlayPlugin (implements java.lang.Comparable<T>)


PKą9D[2javadoc/play/modules/fileauth/package-summary.html play.modules.fileauth

Package play.modules.fileauth

Class Summary
FileAuth Basic Wrapper for all FileAuth Functions.
FileAuthPlugin Entry Class for first file scan.
ScanJob Periodically Scan of user/group files.
 



PKą9D{440javadoc/play/modules/fileauth/package-frame.html play.modules.fileauth play.modules.fileauth
Classes 
FileAuth
FileAuthPlugin
ScanJob
PKÅ9D#˾++*javadoc/play/modules/fileauth/ScanJob.html ScanJob

play.modules.fileauth
Class ScanJob

java.lang.Object
  extended by play.Invoker.Invocation
      extended by play.jobs.Job
          extended by play.modules.fileauth.ScanJob
All Implemented Interfaces:
java.lang.Runnable, java.util.concurrent.Callable

public class ScanJob
extends play.jobs.Job

Periodically Scan of user/group files. Scan runs every 5 mins.


Field Summary
 
Fields inherited from class play.jobs.Job
executor, invocationType, lastException, lastRun, wasError
 
Constructor Summary
ScanJob()
           
 
Method Summary
 void doJob()
           
 
Methods inherited from class play.jobs.Job
_finally, call, doJobWithResult, every, every, execute, getInvocationContext, in, in, now, onException, run, toString
 
Methods inherited from class play.Invoker.Invocation
after, before, init, onSuccess, preInit, suspend
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ScanJob

public ScanJob()
Method Detail

doJob

public void doJob()
Overrides:
doJob in class play.jobs.Job


PKÅ9DfҊ--1javadoc/play/modules/fileauth/FileAuthPlugin.html FileAuthPlugin

play.modules.fileauth
Class FileAuthPlugin

java.lang.Object
  extended by play.PlayPlugin
      extended by play.modules.fileauth.FileAuthPlugin
All Implemented Interfaces:
java.lang.Comparable<play.PlayPlugin>

public class FileAuthPlugin
extends play.PlayPlugin

Entry Class for first file scan.


Field Summary
 
Fields inherited from class play.PlayPlugin
index
 
Constructor Summary
FileAuthPlugin()
           
 
Method Summary
 void onApplicationStart()
          Trigger to scan the files for the first Time.
 
Methods inherited from class play.PlayPlugin
addMimeTypes, addTemplateExtensions, afterActionInvocation, afterApplicationStart, afterFixtureLoad, afterInvocation, beforeActionInvocation, beforeDetectingChanges, beforeInvocation, bind, bind, bind, bindBean, compareTo, compileAll, compileSources, detectChange, detectClassesChange, enhance, getJsonStatus, getMessage, getStatus, invocationFinally, loadTemplate, modelFactory, onActionInvocationResult, onApplicationReady, onApplicationStop, onClassesChange, onConfigurationRead, onEvent, onInvocationException, onInvocationSuccess, onLoad, onRequestRouting, onRoutesLoaded, onTemplateCompilation, overrideTemplateSource, postEvent, rawInvocation, routeRequest, runTest, serveStatic, unBind, willBeValidated
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FileAuthPlugin

public FileAuthPlugin()
Method Detail

onApplicationStart

public void onApplicationStart()
Trigger to scan the files for the first Time.

Overrides:
onApplicationStart in class play.PlayPlugin


PKą9Drnmm5javadoc/play/modules/fileauth/utils/package-tree.html play.modules.fileauth.utils Class Hierarchy

Hierarchy For Package play.modules.fileauth.utils

Package Hierarchies:
All Packages

Class Hierarchy

  • java.lang.Object


PKÅ9Do1TT1javadoc/play/modules/fileauth/utils/MD5Crypt.html MD5Crypt

play.modules.fileauth.utils
Class MD5Crypt

java.lang.Object
  extended by play.modules.fileauth.utils.MD5Crypt

public final class MD5Crypt
extends java.lang.Object

This class defines a method, crypt(), which takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible md5-encoded password entry.


Field Summary
static java.lang.String itoa64
           
static java.lang.String SALTCHARS
           
 
Constructor Summary
MD5Crypt()
           
 
Method Summary
static java.lang.String apacheCrypt(java.lang.String password)
          This method generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
static java.lang.String apacheCrypt(java.lang.String password, java.lang.String salt)
          This method actually generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
static int bytes2u(byte inp)
          convert an encoded unsigned byte value into a int with the unsigned value.
static void clearbits(byte[] bits)
           
static java.lang.String crypt(java.lang.String password)
          This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
static java.lang.String crypt(java.lang.String password, java.lang.String salt)
          This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
static java.lang.String crypt(java.lang.String password, java.lang.String salt, java.lang.String magic)
          This method actually generates md5-encoded password hash from a plaintext password, a salt, and a magic string.
static void main(java.lang.String[] argv)
          Command line test rig.
static java.lang.String to64(long v, int size)
           
static boolean verifyPassword(java.lang.String plaintextPass, java.lang.String md5CryptText)
          This method tests a plaintext password against a md5Crypt'ed hash and returns true if the password matches the hash.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SALTCHARS

public static final java.lang.String SALTCHARS
See Also:
Constant Field Values

itoa64

public static final java.lang.String itoa64
See Also:
Constant Field Values
Constructor Detail

MD5Crypt

public MD5Crypt()
Method Detail

main

public static void main(java.lang.String[] argv)
Command line test rig.


to64

public static final java.lang.String to64(long v,
                                          int size)

clearbits

public static final void clearbits(byte[] bits)

bytes2u

public static final int bytes2u(byte inp)
convert an encoded unsigned byte value into a int with the unsigned value.


crypt

public static final java.lang.String crypt(java.lang.String password)

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
Returns:
An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field.

crypt

public static final java.lang.String crypt(java.lang.String password,
                                           java.lang.String salt)

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
salt - A short string to use to randomize md5. May start with $1$, which will be ignored. It is explicitly permitted to pass a pre-existing MD5Crypt'ed password entry as the salt. crypt() will strip the salt chars out properly.
Returns:
An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field.

apacheCrypt

public static final java.lang.String apacheCrypt(java.lang.String password)

This method generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
Returns:
An Apache-compatible md5-hashed password string.

apacheCrypt

public static final java.lang.String apacheCrypt(java.lang.String password,
                                                 java.lang.String salt)

This method actually generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
salt - A short string to use to randomize md5. May start with $apr1$, which will be ignored. It is explicitly permitted to pass a pre-existing MD5Crypt'ed password entry as the salt. crypt() will strip the salt chars out properly.
Returns:
An Apache-compatible md5-hashed password string.

crypt

public static final java.lang.String crypt(java.lang.String password,
                                           java.lang.String salt,
                                           java.lang.String magic)

This method actually generates md5-encoded password hash from a plaintext password, a salt, and a magic string.

There are two magic strings that make sense to use here.. '$1$' is the magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

The resulting string will be in the form '<magic><salt>$<hashed mess>

Parameters:
password - Plaintext password
salt - A short string to use to randomize md5. May start with the magic string, which will be ignored. It is explicitly permitted to pass a pre-existing MD5Crypt'ed password entry as the salt. crypt() will strip the salt chars out properly.
magic - Either "$apr1$" or "$1$", which controls whether we are doing Apache-style or FreeBSD-style md5Crypt.
Returns:
An md5-hashed password string.

verifyPassword

public static final boolean verifyPassword(java.lang.String plaintextPass,
                                           java.lang.String md5CryptText)
This method tests a plaintext password against a md5Crypt'ed hash and returns true if the password matches the hash. This method will work properly whether the hashtext was crypted using the default FreeBSD md5Crypt algorithm or the Apache md5Crypt variant.

Parameters:
plaintextPass - The plaintext password text to test.
md5CryptText - The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass.


PKą9DO8javadoc/play/modules/fileauth/utils/package-summary.html play.modules.fileauth.utils

Package play.modules.fileauth.utils

Class Summary
MD5Crypt This class defines a method, crypt(), which takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible md5-encoded password entry.
 



PKą9D`/~~6javadoc/play/modules/fileauth/utils/package-frame.html play.modules.fileauth.utils play.modules.fileauth.utils
Classes 
MD5Crypt
PKÅ9D0?javadoc/controllers/Check.html Check

controllers
Annotation Type Check


@Retention(value=RUNTIME)
@Target(value={METHOD,TYPE})
public @interface Check


Required Element Summary
 java.lang.String[] value
           
 

Element Detail

value

public abstract java.lang.String[] value


PKą9D)|%javadoc/controllers/package-tree.html controllers Class Hierarchy

Hierarchy For Package controllers

Package Hierarchies:
All Packages

Class Hierarchy

  • java.lang.Object
    • play.mvc.Controller (implements play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport)

Annotation Type Hierarchy

  • controllers.Check (implements java.lang.annotation.Annotation)


PKÅ9D0O*O*(javadoc/controllers/Secure.Security.html Secure.Security

controllers
Class Secure.Security

java.lang.Object
  extended by play.mvc.Controller
      extended by controllers.Secure.Security
All Implemented Interfaces:
play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport
Direct Known Subclasses:
AuthFileSecurity
Enclosing class:
Secure

public static class Secure.Security
extends play.mvc.Controller


Field Summary
 
Fields inherited from class play.mvc.Controller
_currentReverse, flash, params, renderArgs, request, response, routeArgs, session, validation
 
Constructor Summary
Secure.Security()
           
 
Method Summary
 
Methods inherited from class play.mvc.Controller
await, await, await, await, await, await, badRequest, checkAuthenticity, error, error, error, error, flash, forbidden, forbidden, getActionAnnotation, getControllerAnnotation, getControllerClass, getControllerInheritedAnnotation, notFound, notFound, notFoundIfNull, notFoundIfNull, notModified, ok, parent, parent, parent, redirect, redirect, redirect, redirect, redirectToStatic, render, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderHtml, renderJSON, renderJSON, renderJSON, renderJSON, renderTemplate, renderTemplate, renderTemplate, renderText, renderText, renderXml, renderXml, renderXml, renderXml, reverse, suspend, suspend, template, template, templateExists, todo, unauthorized, unauthorized, waitFor
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Secure.Security

public Secure.Security()


PKÅ9DZ22)javadoc/controllers/AuthFileSecurity.html AuthFileSecurity

controllers
Class AuthFileSecurity

java.lang.Object
  extended by play.mvc.Controller
      extended by controllers.Secure.Security
          extended by controllers.AuthFileSecurity
All Implemented Interfaces:
play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport

public class AuthFileSecurity
extends Secure.Security

This Class provides basice Security Functions for the Play! Security Plugin.


Field Summary
 
Fields inherited from class play.mvc.Controller
_currentReverse, flash, params, renderArgs, request, response, routeArgs, session, validation
 
Constructor Summary
AuthFileSecurity()
           
 
Method Summary
static boolean authentify(java.lang.String username, java.lang.String password)
          Authentify an user against the given AuthFile.
static boolean check(java.lang.String profile)
          Checks if the current user (that is loged in) has the profile (e.g.
 
Methods inherited from class play.mvc.Controller
await, await, await, await, await, await, badRequest, checkAuthenticity, error, error, error, error, flash, forbidden, forbidden, getActionAnnotation, getControllerAnnotation, getControllerClass, getControllerInheritedAnnotation, notFound, notFound, notFoundIfNull, notFoundIfNull, notModified, ok, parent, parent, parent, redirect, redirect, redirect, redirect, redirectToStatic, render, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderHtml, renderJSON, renderJSON, renderJSON, renderJSON, renderTemplate, renderTemplate, renderTemplate, renderText, renderText, renderXml, renderXml, renderXml, renderXml, reverse, suspend, suspend, template, template, templateExists, todo, unauthorized, unauthorized, waitFor
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

AuthFileSecurity

public AuthFileSecurity()
Method Detail

authentify

public static boolean authentify(java.lang.String username,
                                 java.lang.String password)
Authentify an user against the given AuthFile.

Parameters:
username - the given username.
password - the given password.
Returns:
true if username and password matches, otherwise false.

check

public static boolean check(java.lang.String profile)
Checks if the current user (that is loged in) has the profile (e.g. is in the group).

Parameters:
profile -
Returns:
true if the current user has the profile, otherwise false.


PKÅ9D6éG5G5javadoc/controllers/Secure.html Secure

controllers
Class Secure

java.lang.Object
  extended by play.mvc.Controller
      extended by controllers.Secure
All Implemented Interfaces:
play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport

public class Secure
extends play.mvc.Controller


Nested Class Summary
static class Secure.Security
           
 
Field Summary
 
Fields inherited from class play.mvc.Controller
_currentReverse, flash, params, renderArgs, request, response, routeArgs, session, validation
 
Constructor Summary
Secure()
           
 
Method Summary
static void authenticate(java.lang.String username, java.lang.String password, boolean remember)
           
static void login()
           
static void logout()
           
 
Methods inherited from class play.mvc.Controller
await, await, await, await, await, await, badRequest, checkAuthenticity, error, error, error, error, flash, forbidden, forbidden, getActionAnnotation, getControllerAnnotation, getControllerClass, getControllerInheritedAnnotation, notFound, notFound, notFoundIfNull, notFoundIfNull, notModified, ok, parent, parent, parent, redirect, redirect, redirect, redirect, redirectToStatic, render, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderHtml, renderJSON, renderJSON, renderJSON, renderJSON, renderTemplate, renderTemplate, renderTemplate, renderText, renderText, renderXml, renderXml, renderXml, renderXml, reverse, suspend, suspend, template, template, templateExists, todo, unauthorized, unauthorized, waitFor
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Secure

public Secure()
Method Detail

login

public static void login()
                  throws java.lang.Throwable
Throws:
java.lang.Throwable

authenticate

public static void authenticate(java.lang.String username,
                                java.lang.String password,
                                boolean remember)
                         throws java.lang.Throwable
Throws:
java.lang.Throwable

logout

public static void logout()
                   throws java.lang.Throwable
Throws:
java.lang.Throwable


PKą9D&G(javadoc/controllers/package-summary.html controllers

Package controllers

Class Summary
AuthFileSecurity This Class provides basice Security Functions for the Play! Security Plugin.
Secure  
Secure.Security  
 

Annotation Types Summary
Check  
 



PKą9D.^&javadoc/controllers/package-frame.html controllers controllers
Classes 
AuthFileSecurity
Secure
Secure.Security
Annotation Types 
Check
PKoC5K%app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PKoC&!documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PKoC:samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PKoC<samples-and-tests/auth-file-demo/public/stylesheets/main.cssPKoC_5<<.samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPKoC(9  9samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PKSC*,-II:samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PKoCĞ:samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PKSC?5'gg:samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PKoCT %%+samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPKoCc.samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPKoC<_'-samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PKoCǁ4samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PKoC=uu,samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PKSC,m;samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PKoC/%B,samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PKoC#/6samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PKCW  6samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PKoCqhh.samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PKoC_^)//4samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PKoC*$<<Asamples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PKoC:samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PKoCipVV:samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PKoC8rAsamples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPGsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9DOHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9DG-Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK Å9D META-INF/PK …9D META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK …9Dplay/PK …9D play/modules/PK Å9Dplay/modules/fileauth/PK Å9Dplay/modules/fileauth/utils/PK Å9D play.pluginsPK …9D(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK …9D'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK …9Dv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK Å9D AMETA-INF/PK …9D +META-INF/MANIFEST.MFPK …9DAplay/PK …9D A play/modules/PK Å9DA5play/modules/fileauth/PK Å9DAiplay/modules/fileauth/utils/PK Å9D play.pluginsPK …9D(_j $play/modules/fileauth/FileAuth.classPK …9D'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK …9Dv`%#5play/modules/fileauth/ScanJob.classPK Å9D́ %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^Gsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;UIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9DLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D*F>>Psamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/package-listcontrollers play.modules.fileauth play.modules.fileauth.utils PK*9DVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/overview-tree.html Class Hierarchy

Hierarchy For All Packages

Package Hierarchies:
controllers, play.modules.fileauth, play.modules.fileauth.utils

Class Hierarchy

  • java.lang.Object
    • play.mvc.Controller (implements play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport)
    • play.modules.fileauth.FileAuth
    • play.Invoker.Invocation (implements java.lang.Runnable)
      • play.jobs.Job<V> (implements java.util.concurrent.Callable<V>)
    • play.modules.fileauth.utils.MD5Crypt
    • play.PlayPlugin (implements java.lang.Comparable<T>)

Annotation Type Hierarchy

  • controllers.Check (implements java.lang.annotation.Annotation)


PK*9D:Vtoo[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/allclasses-noframe.html All Classes All Classes
AuthFileSecurity
Check
FileAuth
FileAuthPlugin
MD5Crypt
ScanJob
Secure
Secure.Security
PK*9D?MooRsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/stylesheet.css/* Javadoc style sheet */ /* Define colors, fonts and other style attributes here to override the defaults */ /* Page background color */ body { background-color: #FFFFFF; color:#000000 } /* Headings */ h1 { font-size: 145% } /* Table colors */ .TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ .TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ .TableRowColor { background: #FFFFFF; color:#000000 } /* White */ /* Font used in left-hand frame lists */ .FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } .FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } .FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } /* Navigation bar fonts and colors */ .NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ .NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ .NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} .NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} .NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} .NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} PK*9D##Qsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/help-doc.html API Help

How This API Document Is Organized

This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

Overview

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

Package

Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types

Class/Interface

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary

  • Field Detail
  • Constructor Detail
  • Method Detail
Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

Annotation Type

Each annotation type has its own separate page with the following sections:

  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail

Enum

Each enum has its own separate page with the following sections:

  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail

Tree (Class Hierarchy)

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.

Deprecated API

The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

Index

The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

Prev/Next

These links take you to the next or previous class, interface, package, or related page.

Frames/No Frames

These links show and hide the HTML frames. All pages are available with or without frames.

Serialized Form

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

Constant Field Values

The Constant Field Values page lists the static final fields and their values.

This help file applies to API documentation generated using the standard doclet.



PK*9DoAYsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/allclasses-frame.html All Classes All Classes
AuthFileSecurity
Check
FileAuth
FileAuthPlugin
MD5Crypt
ScanJob
Secure
Secure.Security
PK*9DVXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/constant-values.html Constant Field Values

Constant Field Values


Contents
play.modules.*

play.modules.fileauth.FileAuth
public static final java.lang.String AUTH_FILE_GROUPS_CACHE_KEY "AUTH_FILE_GROUPS"
public static final java.lang.String AUTH_FILE_USERS_CACHE_KEY "AUTH_FILE_USERS"

play.modules.fileauth.utils.MD5Crypt
public static final java.lang.String itoa64 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
public static final java.lang.String SALTCHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"



PK*9DA Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/overview-frame.html Overview List
All Classes

Packages
controllers
play.modules.fileauth
play.modules.fileauth.utils

  PK*9D8wJwJRsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/index-all.html Index


A B C D F G I L M O P S T V

A

apacheCrypt(String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
apacheCrypt(String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
AUTH_FILE_GROUPS_CACHE_KEY - Static variable in class play.modules.fileauth.FileAuth
 
AUTH_FILE_USERS_CACHE_KEY - Static variable in class play.modules.fileauth.FileAuth
 
authenticate(String, String, boolean) - Static method in class controllers.Secure
 
authentify(String, String) - Static method in class controllers.AuthFileSecurity
Authentify an user against the given AuthFile.
AuthFileSecurity - Class in controllers
This Class provides basice Security Functions for the Play! Security Plugin.
AuthFileSecurity() - Constructor for class controllers.AuthFileSecurity
 

B

bytes2u(byte) - Static method in class play.modules.fileauth.utils.MD5Crypt
convert an encoded unsigned byte value into a int with the unsigned value.

C

check(String) - Static method in class controllers.AuthFileSecurity
Checks if the current user (that is loged in) has the profile (e.g.
Check - Annotation Type in controllers
 
clearbits(byte[]) - Static method in class play.modules.fileauth.utils.MD5Crypt
 
contains(String, String) - Static method in class play.modules.fileauth.FileAuth
Checks if a group contains a given username.
controllers - package controllers
 
crypt(String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
crypt(String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
crypt(String, String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method actually generates md5-encoded password hash from a plaintext password, a salt, and a magic string.

D

doJob() - Method in class play.modules.fileauth.ScanJob
 

F

FileAuth - Class in play.modules.fileauth
Basic Wrapper for all FileAuth Functions.
FileAuth() - Constructor for class play.modules.fileauth.FileAuth
 
FileAuthPlugin - Class in play.modules.fileauth
Entry Class for first file scan.
FileAuthPlugin() - Constructor for class play.modules.fileauth.FileAuthPlugin
 

G

getGroups() - Static method in class play.modules.fileauth.FileAuth
Returns a Map of all Groups (groups/usernames).
getUsers() - Static method in class play.modules.fileauth.FileAuth
Returns a Map of all Users (user/password hash).

I

IS_ENABLED - Static variable in class play.modules.fileauth.FileAuth
 
itoa64 - Static variable in class play.modules.fileauth.utils.MD5Crypt
 

L

login() - Static method in class controllers.Secure
 
logout() - Static method in class controllers.Secure
 

M

main(String[]) - Static method in class play.modules.fileauth.utils.MD5Crypt
Command line test rig.
MD5Crypt - Class in play.modules.fileauth.utils
This class defines a method, crypt(), which takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible md5-encoded password entry.
MD5Crypt() - Constructor for class play.modules.fileauth.utils.MD5Crypt
 

O

onApplicationStart() - Method in class play.modules.fileauth.FileAuthPlugin
Trigger to scan the files for the first Time.

P

play.modules.fileauth - package play.modules.fileauth
 
play.modules.fileauth.utils - package play.modules.fileauth.utils
 

S

SALTCHARS - Static variable in class play.modules.fileauth.utils.MD5Crypt
 
scanGroups() - Static method in class play.modules.fileauth.FileAuth
Rescans the groups file.
ScanJob - Class in play.modules.fileauth
Periodically Scan of user/group files.
ScanJob() - Constructor for class play.modules.fileauth.ScanJob
 
scanUsers() - Static method in class play.modules.fileauth.FileAuth
Rescans the users file.
Secure - Class in controllers
 
Secure() - Constructor for class controllers.Secure
 
Secure.Security - Class in controllers
 
Secure.Security() - Constructor for class controllers.Secure.Security
 

T

to64(long, int) - Static method in class play.modules.fileauth.utils.MD5Crypt
 

V

validate(String, String) - Static method in class play.modules.fileauth.FileAuth
Validates an user with a given password agains the user/password hash mapping.
verifyPassword(String, String) - Static method in class play.modules.fileauth.utils.MD5Crypt
This method tests a plaintext password against a md5Crypt'ed hash and returns true if the password matches the hash.

A B C D F G I L M O P S T V

PK*9D Nsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/index.html Generated Documentation (Untitled) <H2> Frame Alert</H2> <P> This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. <BR> Link to<A HREF="overview-summary.html">Non-frame version.</A> PK*9D^}ɀYsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/overview-summary.html Overview

Packages
controllers  
play.modules.fileauth  
play.modules.fileauth.utils  

 



PK*9DaYWYXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/deprecated-list.html Deprecated List

Deprecated API


Contents


PK*9DM99Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/resources/inherit.gifGIF89a, DrjԐ;߀Q@N;PK*9DT??gsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/FileAuth.html FileAuth

play.modules.fileauth
Class FileAuth

java.lang.Object
  extended by play.modules.fileauth.FileAuth

public class FileAuth
extends java.lang.Object

Basic Wrapper for all FileAuth Functions.


Field Summary
static java.lang.String AUTH_FILE_GROUPS_CACHE_KEY
           
static java.lang.String AUTH_FILE_USERS_CACHE_KEY
           
static boolean IS_ENABLED
           
 
Constructor Summary
FileAuth()
           
 
Method Summary
static boolean contains(java.lang.String group, java.lang.String user)
          Checks if a group contains a given username.
static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getGroups()
          Returns a Map of all Groups (groups/usernames).
static java.util.Map<java.lang.String,java.lang.String> getUsers()
          Returns a Map of all Users (user/password hash).
static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> scanGroups()
          Rescans the groups file.
static java.util.Map<java.lang.String,java.lang.String> scanUsers()
          Rescans the users file.
static boolean validate(java.lang.String user, java.lang.String password)
          Validates an user with a given password agains the user/password hash mapping.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

AUTH_FILE_USERS_CACHE_KEY

public static final java.lang.String AUTH_FILE_USERS_CACHE_KEY
See Also:
Constant Field Values

IS_ENABLED

public static final boolean IS_ENABLED

AUTH_FILE_GROUPS_CACHE_KEY

public static final java.lang.String AUTH_FILE_GROUPS_CACHE_KEY
See Also:
Constant Field Values
Constructor Detail

FileAuth

public FileAuth()
Method Detail

getUsers

public static java.util.Map<java.lang.String,java.lang.String> getUsers()
Returns a Map of all Users (user/password hash).

Returns:
the Map.

getGroups

public static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getGroups()
Returns a Map of all Groups (groups/usernames).

Returns:
the Map.

contains

public static boolean contains(java.lang.String group,
                               java.lang.String user)
Checks if a group contains a given username.

Parameters:
group - the Group to check.
user - the user to check.
Returns:
true if user is in group, otherwise false.

validate

public static boolean validate(java.lang.String user,
                               java.lang.String password)
Validates an user with a given password agains the user/password hash mapping.

Parameters:
user - the given user.
password - the given password (clear text).
Returns:
true if validation okay, otherwise false.

scanUsers

public static java.util.Map<java.lang.String,java.lang.String> scanUsers()
Rescans the users file.

Returns:
the updated Map of users.

scanGroups

public static java.util.Map<java.lang.String,java.util.Set<java.lang.String>> scanGroups()
Rescans the groups file.

Returns:
the updated Map of groups.


PK*9DPksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/package-tree.html play.modules.fileauth Class Hierarchy

Hierarchy For Package play.modules.fileauth

Package Hierarchies:
All Packages

Class Hierarchy

  • java.lang.Object
    • play.modules.fileauth.FileAuth
    • play.Invoker.Invocation (implements java.lang.Runnable)
      • play.jobs.Job<V> (implements java.util.concurrent.Callable<V>)
    • play.PlayPlugin (implements java.lang.Comparable<T>)


PK*9DQnsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/package-summary.html play.modules.fileauth

Package play.modules.fileauth

Class Summary
FileAuth Basic Wrapper for all FileAuth Functions.
FileAuthPlugin Entry Class for first file scan.
ScanJob Periodically Scan of user/group files.
 



PK*9Dp&55lsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/package-frame.html play.modules.fileauth play.modules.fileauth
Classes 
FileAuth
FileAuthPlugin
ScanJob
PK*9DeQ磿++fsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/ScanJob.html ScanJob

play.modules.fileauth
Class ScanJob

java.lang.Object
  extended by play.Invoker.Invocation
      extended by play.jobs.Job
          extended by play.modules.fileauth.ScanJob
All Implemented Interfaces:
java.lang.Runnable, java.util.concurrent.Callable

public class ScanJob
extends play.jobs.Job

Periodically Scan of user/group files. Scan runs every 5 mins.


Field Summary
 
Fields inherited from class play.jobs.Job
executor, invocationType, lastException, lastRun, wasError
 
Constructor Summary
ScanJob()
           
 
Method Summary
 void doJob()
           
 
Methods inherited from class play.jobs.Job
_finally, call, doJobWithResult, every, every, execute, getInvocationContext, in, in, now, onException, run, toString
 
Methods inherited from class play.Invoker.Invocation
after, before, init, onSuccess, preInit, suspend
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ScanJob

public ScanJob()
Method Detail

doJob

public void doJob()
Overrides:
doJob in class play.jobs.Job


PK*9Du f--msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/FileAuthPlugin.html FileAuthPlugin

play.modules.fileauth
Class FileAuthPlugin

java.lang.Object
  extended by play.PlayPlugin
      extended by play.modules.fileauth.FileAuthPlugin
All Implemented Interfaces:
java.lang.Comparable<play.PlayPlugin>

public class FileAuthPlugin
extends play.PlayPlugin

Entry Class for first file scan.


Field Summary
 
Fields inherited from class play.PlayPlugin
index
 
Constructor Summary
FileAuthPlugin()
           
 
Method Summary
 void onApplicationStart()
          Trigger to scan the files for the first Time.
 
Methods inherited from class play.PlayPlugin
addMimeTypes, addTemplateExtensions, afterActionInvocation, afterApplicationStart, afterFixtureLoad, afterInvocation, beforeActionInvocation, beforeDetectingChanges, beforeInvocation, bind, bind, bind, bindBean, compareTo, compileAll, compileSources, detectChange, detectClassesChange, enhance, getJsonStatus, getMessage, getStatus, invocationFinally, loadTemplate, modelFactory, onActionInvocationResult, onApplicationReady, onApplicationStop, onClassesChange, onConfigurationRead, onEvent, onInvocationException, onInvocationSuccess, onLoad, onRequestRouting, onRoutesLoaded, onTemplateCompilation, overrideTemplateSource, postEvent, rawInvocation, routeRequest, runTest, serveStatic, unBind, willBeValidated
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FileAuthPlugin

public FileAuthPlugin()
Method Detail

onApplicationStart

public void onApplicationStart()
Trigger to scan the files for the first Time.

Overrides:
onApplicationStart in class play.PlayPlugin


PK*9Dzznnqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/package-tree.html play.modules.fileauth.utils Class Hierarchy

Hierarchy For Package play.modules.fileauth.utils

Package Hierarchies:
All Packages

Class Hierarchy

  • java.lang.Object


PK*9DdTTmsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/MD5Crypt.html MD5Crypt

play.modules.fileauth.utils
Class MD5Crypt

java.lang.Object
  extended by play.modules.fileauth.utils.MD5Crypt

public final class MD5Crypt
extends java.lang.Object

This class defines a method, crypt(), which takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible md5-encoded password entry.


Field Summary
static java.lang.String itoa64
           
static java.lang.String SALTCHARS
           
 
Constructor Summary
MD5Crypt()
           
 
Method Summary
static java.lang.String apacheCrypt(java.lang.String password)
          This method generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
static java.lang.String apacheCrypt(java.lang.String password, java.lang.String salt)
          This method actually generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.
static int bytes2u(byte inp)
          convert an encoded unsigned byte value into a int with the unsigned value.
static void clearbits(byte[] bits)
           
static java.lang.String crypt(java.lang.String password)
          This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
static java.lang.String crypt(java.lang.String password, java.lang.String salt)
          This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.
static java.lang.String crypt(java.lang.String password, java.lang.String salt, java.lang.String magic)
          This method actually generates md5-encoded password hash from a plaintext password, a salt, and a magic string.
static void main(java.lang.String[] argv)
          Command line test rig.
static java.lang.String to64(long v, int size)
           
static boolean verifyPassword(java.lang.String plaintextPass, java.lang.String md5CryptText)
          This method tests a plaintext password against a md5Crypt'ed hash and returns true if the password matches the hash.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SALTCHARS

public static final java.lang.String SALTCHARS
See Also:
Constant Field Values

itoa64

public static final java.lang.String itoa64
See Also:
Constant Field Values
Constructor Detail

MD5Crypt

public MD5Crypt()
Method Detail

main

public static void main(java.lang.String[] argv)
Command line test rig.


to64

public static final java.lang.String to64(long v,
                                          int size)

clearbits

public static final void clearbits(byte[] bits)

bytes2u

public static final int bytes2u(byte inp)
convert an encoded unsigned byte value into a int with the unsigned value.


crypt

public static final java.lang.String crypt(java.lang.String password)

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
Returns:
An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field.

crypt

public static final java.lang.String crypt(java.lang.String password,
                                           java.lang.String salt)

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
salt - A short string to use to randomize md5. May start with $1$, which will be ignored. It is explicitly permitted to pass a pre-existing MD5Crypt'ed password entry as the salt. crypt() will strip the salt chars out properly.
Returns:
An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field.

apacheCrypt

public static final java.lang.String apacheCrypt(java.lang.String password)

This method generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
Returns:
An Apache-compatible md5-hashed password string.

apacheCrypt

public static final java.lang.String apacheCrypt(java.lang.String password,
                                                 java.lang.String salt)

This method actually generates an Apache MD5 compatible md5-encoded password hash from a plaintext password and a salt.

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

Parameters:
password - Plaintext password
salt - A short string to use to randomize md5. May start with $apr1$, which will be ignored. It is explicitly permitted to pass a pre-existing MD5Crypt'ed password entry as the salt. crypt() will strip the salt chars out properly.
Returns:
An Apache-compatible md5-hashed password string.

crypt

public static final java.lang.String crypt(java.lang.String password,
                                           java.lang.String salt,
                                           java.lang.String magic)

This method actually generates md5-encoded password hash from a plaintext password, a salt, and a magic string.

There are two magic strings that make sense to use here.. '$1$' is the magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

The resulting string will be in the form '<magic><salt>$<hashed mess>

Parameters:
password - Plaintext password
salt - A short string to use to randomize md5. May start with the magic string, which will be ignored. It is explicitly permitted to pass a pre-existing MD5Crypt'ed password entry as the salt. crypt() will strip the salt chars out properly.
magic - Either "$apr1$" or "$1$", which controls whether we are doing Apache-style or FreeBSD-style md5Crypt.
Returns:
An md5-hashed password string.

verifyPassword

public static final boolean verifyPassword(java.lang.String plaintextPass,
                                           java.lang.String md5CryptText)
This method tests a plaintext password against a md5Crypt'ed hash and returns true if the password matches the hash. This method will work properly whether the hashtext was crypted using the default FreeBSD md5Crypt algorithm or the Apache md5Crypt variant.

Parameters:
plaintextPass - The plaintext password text to test.
md5CryptText - The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass.


PK*9Dߤ{tsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/package-summary.html play.modules.fileauth.utils

Package play.modules.fileauth.utils

Class Summary
MD5Crypt This class defines a method, crypt(), which takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible md5-encoded password entry.
 



PK*9DFrsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/package-frame.html play.modules.fileauth.utils play.modules.fileauth.utils
Classes 
MD5Crypt
PK*9D]" Zsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/Check.html Check

controllers
Annotation Type Check


@Retention(value=RUNTIME)
@Target(value={METHOD,TYPE})
public @interface Check


Required Element Summary
 java.lang.String[] value
           
 

Element Detail

value

public abstract java.lang.String[] value


PK*9Dasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/package-tree.html controllers Class Hierarchy

Hierarchy For Package controllers

Package Hierarchies:
All Packages

Class Hierarchy

  • java.lang.Object
    • play.mvc.Controller (implements play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport)

Annotation Type Hierarchy

  • controllers.Check (implements java.lang.annotation.Annotation)


PK*9DkP*P*dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/Secure.Security.html Secure.Security

controllers
Class Secure.Security

java.lang.Object
  extended by play.mvc.Controller
      extended by controllers.Secure.Security
All Implemented Interfaces:
play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport
Direct Known Subclasses:
AuthFileSecurity
Enclosing class:
Secure

public static class Secure.Security
extends play.mvc.Controller


Field Summary
 
Fields inherited from class play.mvc.Controller
_currentReverse, flash, params, renderArgs, request, response, routeArgs, session, validation
 
Constructor Summary
Secure.Security()
           
 
Method Summary
 
Methods inherited from class play.mvc.Controller
await, await, await, await, await, await, badRequest, checkAuthenticity, error, error, error, error, flash, forbidden, forbidden, getActionAnnotation, getControllerAnnotation, getControllerClass, getControllerInheritedAnnotation, notFound, notFound, notFoundIfNull, notFoundIfNull, notModified, ok, parent, parent, parent, redirect, redirect, redirect, redirect, redirectToStatic, render, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderHtml, renderJSON, renderJSON, renderJSON, renderJSON, renderTemplate, renderTemplate, renderTemplate, renderText, renderText, renderXml, renderXml, renderXml, renderXml, reverse, suspend, suspend, template, template, templateExists, todo, unauthorized, unauthorized, waitFor
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Secure.Security

public Secure.Security()


PK*9Dځ22esamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/AuthFileSecurity.html AuthFileSecurity

controllers
Class AuthFileSecurity

java.lang.Object
  extended by play.mvc.Controller
      extended by controllers.Secure.Security
          extended by controllers.AuthFileSecurity
All Implemented Interfaces:
play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport

public class AuthFileSecurity
extends Secure.Security

This Class provides basice Security Functions for the Play! Security Plugin.


Field Summary
 
Fields inherited from class play.mvc.Controller
_currentReverse, flash, params, renderArgs, request, response, routeArgs, session, validation
 
Constructor Summary
AuthFileSecurity()
           
 
Method Summary
static boolean authentify(java.lang.String username, java.lang.String password)
          Authentify an user against the given AuthFile.
static boolean check(java.lang.String profile)
          Checks if the current user (that is loged in) has the profile (e.g.
 
Methods inherited from class play.mvc.Controller
await, await, await, await, await, await, badRequest, checkAuthenticity, error, error, error, error, flash, forbidden, forbidden, getActionAnnotation, getControllerAnnotation, getControllerClass, getControllerInheritedAnnotation, notFound, notFound, notFoundIfNull, notFoundIfNull, notModified, ok, parent, parent, parent, redirect, redirect, redirect, redirect, redirectToStatic, render, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderHtml, renderJSON, renderJSON, renderJSON, renderJSON, renderTemplate, renderTemplate, renderTemplate, renderText, renderText, renderXml, renderXml, renderXml, renderXml, reverse, suspend, suspend, template, template, templateExists, todo, unauthorized, unauthorized, waitFor
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

AuthFileSecurity

public AuthFileSecurity()
Method Detail

authentify

public static boolean authentify(java.lang.String username,
                                 java.lang.String password)
Authentify an user against the given AuthFile.

Parameters:
username - the given username.
password - the given password.
Returns:
true if username and password matches, otherwise false.

check

public static boolean check(java.lang.String profile)
Checks if the current user (that is loged in) has the profile (e.g. is in the group).

Parameters:
profile -
Returns:
true if the current user has the profile, otherwise false.


PK*9DH5H5[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/Secure.html Secure

controllers
Class Secure

java.lang.Object
  extended by play.mvc.Controller
      extended by controllers.Secure
All Implemented Interfaces:
play.classloading.enhancers.ControllersEnhancer.ControllerSupport, play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesSupport

public class Secure
extends play.mvc.Controller


Nested Class Summary
static class Secure.Security
           
 
Field Summary
 
Fields inherited from class play.mvc.Controller
_currentReverse, flash, params, renderArgs, request, response, routeArgs, session, validation
 
Constructor Summary
Secure()
           
 
Method Summary
static void authenticate(java.lang.String username, java.lang.String password, boolean remember)
           
static void login()
           
static void logout()
           
 
Methods inherited from class play.mvc.Controller
await, await, await, await, await, await, badRequest, checkAuthenticity, error, error, error, error, flash, forbidden, forbidden, getActionAnnotation, getControllerAnnotation, getControllerClass, getControllerInheritedAnnotation, notFound, notFound, notFoundIfNull, notFoundIfNull, notModified, ok, parent, parent, parent, redirect, redirect, redirect, redirect, redirectToStatic, render, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderBinary, renderHtml, renderJSON, renderJSON, renderJSON, renderJSON, renderTemplate, renderTemplate, renderTemplate, renderText, renderText, renderXml, renderXml, renderXml, renderXml, reverse, suspend, suspend, template, template, templateExists, todo, unauthorized, unauthorized, waitFor
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Secure

public Secure()
Method Detail

login

public static void login()
                  throws java.lang.Throwable
Throws:
java.lang.Throwable

authenticate

public static void authenticate(java.lang.String username,
                                java.lang.String password,
                                boolean remember)
                         throws java.lang.Throwable
Throws:
java.lang.Throwable

logout

public static void logout()
                   throws java.lang.Throwable
Throws:
java.lang.Throwable


PK*9D dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/package-summary.html controllers

Package controllers

Class Summary
AuthFileSecurity This Class provides basice Security Functions for the Play! Security Plugin.
Secure  
Secure.Security  
 

Annotation Types Summary
Check  
 



PK*9DVbsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/package-frame.html controllers controllers
Classes 
AuthFileSecurity
Secure
Secure.Security
Annotation Types 
Check
PK*9D5Kasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&]samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-IIvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'ggvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%gsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcjsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁpsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uuhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,mwsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%Bhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhjsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//psamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8r}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9DK samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc +Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9D}bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK C META-INF/PK C META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK Cplay/PK C play/modules/PK Cplay/modules/fileauth/PK Cplay/modules/fileauth/utils/PK C play.pluginsPK C(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK C'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK Cv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK C AMETA-INF/PK C +META-INF/MANIFEST.MFPK CAplay/PK C A play/modules/PK CA5play/modules/fileauth/PK CAiplay/modules/fileauth/utils/PK C play.pluginsPK C(_j $play/modules/fileauth/FileAuth.classPK C'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK Cv`%#5play/modules/fileauth/ScanJob.classPK Ć %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'ggsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc ++Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9D"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK FC META-INF/PK EC META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK FCplay/PK FC play/modules/PK FCplay/modules/fileauth/PK FCplay/modules/fileauth/utils/PK FC play.pluginsPK FC(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK FC'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK FCv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK FC AMETA-INF/PK EC +META-INF/MANIFEST.MFPK FCAplay/PK FC A play/modules/PK FCA5play/modules/fileauth/PK FCAiplay/modules/fileauth/utils/PK FC play.pluginsPK FC(_j $play/modules/fileauth/FileAuth.classPK FC'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK FCv`%#5play/modules/fileauth/ScanJob.classPK FĆ %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'ggsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9D%osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc *Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9D# samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK C META-INF/PK C META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK Cplay/PK C play/modules/PK Cplay/modules/fileauth/PK Cplay/modules/fileauth/utils/PK C play.pluginsPK C(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK C'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK Cv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK C AMETA-INF/PK C +META-INF/MANIFEST.MFPK CAplay/PK C A play/modules/PK CA5play/modules/fileauth/PK CAiplay/modules/fileauth/utils/PK C play.pluginsPK C(_j $play/modules/fileauth/FileAuth.classPK C'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK Cv`%#5play/modules/fileauth/ScanJob.classPK Ć %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9D*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9D,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  )samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-II*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞ*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'gg*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁ$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,m+samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  &samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9D*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVV*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8r1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPP7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZ5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVV5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9Da8samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc X*Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$4samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9D@óGsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK ՖC META-INF/PK ԖC META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK ՖCplay/PK ՖC play/modules/PK ՖCplay/modules/fileauth/PK ՖCplay/modules/fileauth/utils/PK ՖC play.pluginsPK ՖC(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK ՖC'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK ՖCv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK ՖC AMETA-INF/PK ԖC +META-INF/MANIFEST.MFPK ՖCAplay/PK ՖC A play/modules/PK ՖCA5play/modules/fileauth/PK ՖCAiplay/modules/fileauth/utils/PK ՖC play.pluginsPK ՖC(_j $play/modules/fileauth/FileAuth.classPK ՖC'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK ՖCv`%#5play/modules/fileauth/ScanJob.classPK ՖĆ %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;U9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9D<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPSsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5KQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&Msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<Zsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  esamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-IIfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'ggfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9DcZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁ`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uuXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,mgsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%BXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9DqhhZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8rmsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9Dnxtsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc )Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$psamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK PC META-INF/PK OC META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK PCplay/PK PC play/modules/PK PCplay/modules/fileauth/PK PCplay/modules/fileauth/utils/PK PC play.pluginsPK PC(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK PC'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK PCv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK PC AMETA-INF/PK OC +META-INF/MANIFEST.MFPK PCAplay/PK PC A play/modules/PK PCA5play/modules/fileauth/PK PCAiplay/modules/fileauth/utils/PK PC play.pluginsPK PC(_j $play/modules/fileauth/FileAuth.classPK PC'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK PCv`%#5play/modules/fileauth/ScanJob.classPK PĆ %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^ssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TT}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJ}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;Uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9Dxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'ggsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9DNsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc k(Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9D0㕻samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK VC META-INF/PK UC META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK UCplay/PK UC play/modules/PK UCplay/modules/fileauth/PK UCplay/modules/fileauth/utils/PK UC play.pluginsPK UC(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK UC'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK UCv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK VC AMETA-INF/PK UC +META-INF/MANIFEST.MFPK UCAplay/PK UC A play/modules/PK UCA5play/modules/fileauth/PK UCAiplay/modules/fileauth/utils/PK UC play.pluginsPK UC(_j $play/modules/fileauth/FileAuth.classPK UC'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK UCv`%#5play/modules/fileauth/ScanJob.classPK UĆ %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanUsers(); } @Test public void testUsersRead() { Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9D?5'ggsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Logger.info("file path: "+Play.configuration.getProperty("authfile.users.path")); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest 03.08.2012 * * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); FileAuth.scanGroups(); FileAuth.scanUsers(); } @Test public void testGroupsRead() { Logger.info("testGroupsRead"); FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); int groupSize = groups.size(); assertTrue(String.format("but was %d ", groupSize), groupSize > 0); } @Test public void testGroupContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "users"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); user = "root"; assertTrue(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "root"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } public void testGroupNotExists() { FileAuth.scanGroups(); FileAuth.scanUsers(); String user = "user"; String group = "user"; assertFalse(String.format("u: %s, g: %s", user, group), FileAuth.contains(group, user)); } } PK*9D/%Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9DE:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc Rc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9D"YOsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK lC META-INF/PK kC META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK kCplay/PK kC play/modules/PK kCplay/modules/fileauth/PK kCplay/modules/fileauth/utils/PK kC play.pluginsPK kC(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK kC'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK kCv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK lC AMETA-INF/PK kC +META-INF/MANIFEST.MFPK kCAplay/PK kC A play/modules/PK kCA5play/modules/fileauth/PK kCAiplay/modules/fileauth/utils/PK kC play.pluginsPK kC(_j $play/modules/fileauth/FileAuth.classPK kC'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK kCv`%#5play/modules/fileauth/ScanJob.classPK kĆ %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D7?IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9Dd s*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %% samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_' samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9Dǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uu samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } } PK*9D/%B samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<!samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8r!samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9DD6IPP'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.py# Here you can create play commands that are specific to the module, and extend existing commands MODULE = 'play-file-auth' # Commands that are specific to your module COMMANDS = ['play-file-auth:hello'] def execute(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "play-file-auth:hello": print "~ Hello" # This will be executed before any command (new, run...) def before(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") # This will be executed after any command (new, run...) def after(**kargs): command = kargs.get("command") app = kargs.get("app") args = kargs.get("args") env = kargs.get("env") if command == "new": pass PK*9DZ%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdplay-file-auth ============== This Module supports authentication of Play! 1.x Applications agains Unix Auth Files (e.g. Apache htusers) This Plugin works for all Auth Files with the following syntax: user1:passwordhash user1:passwordhash:...:...: group:user1 user2 group:x:...:user1,user2 The Hash Algorithm has to be either MD5 Crypt or MD5 Apache Crypt. $1$... $apr1$...PK*9DaCVV%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PK*9Deme(samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyc ARc@s.dZdgZdZdZdZdS(splay-file-authsplay-file-auth:hellocKsV|id}|id}|id}|id}|djo dGHndS(Ntcommandtapptargstenvsplay-file-auth:hellos~ Hello(tget(tkargsRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytexecute s  cKs@|id}|id}|id}|id}dS(NRRRR(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytbeforescKsQ|id}|id}|id}|id}|djondS(NRRRRtnew(R(RRRRR((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pytafters  N(tMODULEtCOMMANDSRRR (((s/home/javastream.de/jenkins/jobs/de.consolving.play-file-auth-module/workspace/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyts  PK*9Dxϑ[$$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PK*9Duv-7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK 1C META-INF/PK 0C META-INF/MANIFEST.MFM 0E@! UHɡ"T\噾iRtߛlC$:qR g#zAQXתo!,\V5s+E݉t1DŽkwՑ3b'\[lP! %[,JR?PK 0Cplay/PK 0C play/modules/PK 0Cplay/modules/fileauth/PK 0Cplay/modules/fileauth/utils/PK 0C play.pluginsPK 0C(_j $play/modules/fileauth/FileAuth.classW{|&$D,,QZPEBL hD$ngg૾j[m}kO4R!1GVk[}~wfbȏ8sswϝ}Op"k|8ʸN (^p/IEhn*j1Jp"Vv Rq72DaW}_P[xDưhc -VUT +}*fbhR]{DK1*6xZ2*J=ࠂgRpXs2Wq.EՄ#454tv4nioXس[b}^ѣeFWH(iEHҐ6w4կii3bI{zZ7΄aQ{VeUʭmFj[8=ڌ)+g^6YuPMA_EgC֊%OiQ0 릍cM)Q;r:UA#W sSSăy)ӀB m]ĥ1+L:^k(nvDM;lKkPNL5ɾ>2› =lX\wGHa;$˪ JX2nkm3vyVyc\dn= sа Zr S_3𵧜p떵P2f"3]J}3;בPVFS%^9$s5U:cX',2Lb, 3뇆جah^&mc5 LxUq436-q.nxCÏf4o5NT IZ𦌟k_`bСVЌ5w&ݸbז+ o$h!wqJ٠FcvP:l| + S4pJ(A4i#'bB6,j+>0T7@YJZ ϿȻ3SxUNT,/0hDmDmdnXfP{l}lxY\SۭXܰlHBr Bz>RI(TϚkRhl3t#4ҷ{2A27iYFL6a\/dzر, rK_mFb* @R ]yIxGa&ě5rThs"ˎO*-I#]u*r9`\񤝗4iڕ`ɜHz/<2,+&"ffaGu8M"x8qs>H-eFI-{}F^Gxj)|#H-f/G.}~O\Q(R؞Cb5(kq2-்ys]7Ir>g d"#Q"Yv%"YM$k&!p 5D҃}S=yx\{FQZS=Prc(-ž,E4Ks ad zJ01`u(06'd]E JRk[k|:0v Tȁv`qh ~ y%<0Bˁr@d_@Ը) _ˮP_:J~/ bP -8l8is'sX#zQOSu yNi M`Vh ]#n>m.s#L:Y5ty4ؙS3$l$j2Dq/z-O lw0C8~\A\Iqmp#Mʹq݂ ܊79~ov~)]Nj/]_B*܀:~龙(LgqvF'2Q$24F2 5AcEa{ERryÕOsZ>m~tLL)8pI xx'pmDIyvcvֈ5e%ٝ=,y>bṇ~K ){ sy\H|wjNw ]"lNeVje!UJHW񵔈d J3Jk rq-9);e *~]X缱h߹}ٍυl?`PK 0C'ȭrp*play/modules/fileauth/FileAuthPlugin.classQJ1֮nkVzU(R\|V "c]5&e/勂Gg*a&̙$/b#Y 1Y(Z(1wY_?aHǐo E}+Ii.'z$K0:}݋8Bz< /MiҖхP;` EBN.CNvzq(C{YXgEK tLeR yx.RӨ|;; /*V1F,bF<vlۄD#C'rMrĹ'g0[H~`_rVV<(tR7EbyT7PK 0Cv`%#play/modules/fileauth/ScanJob.class}PNA.xpƄ51Q80! I=@ăq~Twue??n"O /f!q!HOb܆"DLjI<©pZY+6,'Q~~I.vOp>5<%Ӝ>||x__/ 2|8W&@v8p="aj_cSZַnhkؾs箮=}{>?Cp (F‘h,~? ED|cro6,o{ np+Ȁ:)Uxマ喈u~m?n?ʮ~,oV!ڃ"!.k7 CBa~C{ʁ;I*GFWemy2z  ZwAie[3oz3_솀5*<鬅K(vh NPG둎O{MU(qW'KmluO& O3J8e"̜6mq GQ]3cwAz4XHgR QdX1J2@9*{H۴Mw-T|_'%v2V4dt,͠Om8._nz8e,?0ORM1 #V4 7\IH_6sL+i>ZQnIp{S>ϋ_ߕsv[}@Ӥ*"i~?}ݵ!vSd|."aCUe9y5YCfVم+('Lnirg V:M 'f9wnyJhS"TQ4y~4a 5I/?xP㼀 tJx|ovtxEHi \fˈplYF5효%~uƚ%s]XH93)PxZShq<ɡ^)4^E[ gv/Ϟ[oq )je-)jγ Y-y֢Yֲ<-*sN5tNZ'-ߤ#mT=ޣ w*STq|3O2WLk7Y)}=+-X5f5x~f`ubbU` ckX#ʚ.j6l ’l;E^g/X'{d.C96԰fkb{ ~p 6b:$u ]hAWDU6QjV@\q ?dyu5 ^&PB˅FZxFdI8|7xξʂ(b2V2eNiQ4☆!GPK 1C AMETA-INF/PK 0C +META-INF/MANIFEST.MFPK 0CAplay/PK 0C A play/modules/PK 0CA5play/modules/fileauth/PK 0CAiplay/modules/fileauth/utils/PK 0C play.pluginsPK 0C(_j $play/modules/fileauth/FileAuth.classPK 0C'ȭrp*{ play/modules/fileauth/FileAuthPlugin.classPK 0Cv`%#5play/modules/fileauth/ScanJob.classPK 0Ć %*play/modules/fileauth/utils/MD5Crypt.classPK PK*9DQ.^'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routes# This file defines all module routes (Higher priority routes first) # # import these routes in the main app as : # * / module:play-file-auth # # ~~~~ GET /? Module.indexPK*9D1S*TT1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PK*9D(JJ1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePK*9D;U)samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messages# Default play-file-auth messages # You can specialize this file for each language. # For exemple, for french create a messages.fr file #play-file-auth.name=play-file-authPK*9D,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.java/** * ScanJob * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.jobs.Every; import play.jobs.Job; /** * Periodically Scan of user/group files. Scan runs every 5 mins. * @author Philipp Haußleiter */ @Every("5min") public class ScanJob extends Job { @Override public void doJob(){ FileAuth.scanUsers(); FileAuth.scanGroups(); } } PK*9DlPCsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.java/** * FileAuth 31.07.2012 * * @author Philipp Haussleiter * */ package play.modules.fileauth; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import play.Logger; import play.Play; import play.cache.Cache; import play.modules.fileauth.utils.MD5Crypt; /** * Basic Wrapper for all FileAuth Functions. * * @author Philipp Haußleiter */ public class FileAuth { /* Cache Key for User/PasswordHash Map */ public final static String AUTH_FILE_USERS_CACHE_KEY = "AUTH_FILE_USERS"; /* Cache Key for Group/Users Map */ public final static boolean IS_ENABLED = isEnabled(); public final static String AUTH_FILE_GROUPS_CACHE_KEY = "AUTH_FILE_GROUPS"; private final static String CACHE_TIMEOUT = "5mn"; /** * Returns a Map of all Users (user/password hash). * * @return the Map. */ public static Map getUsers() { if (!IS_ENABLED) { return new HashMap(); } Map users = Cache.get(AUTH_FILE_USERS_CACHE_KEY, HashMap.class); if (users == null) { users = scanUsers(); } return users; } /** * Returns a Map of all Groups (groups/usernames). * * @return the Map. */ public static Map> getGroups() { if (!IS_ENABLED) { return new HashMap>(); } Map> groups = Cache.get(AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); if (groups == null) { groups = scanGroups(); } return groups; } /** * Checks if a group contains a given username. * * @param group the Group to check. * @param user the user to check. * @return true if user is in group, otherwise false. */ public static boolean contains(String group, String user) { if (!IS_ENABLED) { return true; } if (group == null || user == null) { return false; } Map> groups = getGroups(); Set groupUsers = groups.get(group); if (groupUsers == null) { return false; } return groupUsers.contains(user); } /** * Validates an user with a given password agains the user/password hash * mapping. * * @param user the given user. * @param password the given password (clear text). * @return true if validation okay, otherwise false. */ public static boolean validate(String user, String password) { if (!IS_ENABLED) { return true; } if (user == null || password == null) { return false; } Map users = getUsers(); String encryptedPass = users.get(user); if (encryptedPass == null) { return false; } return MD5Crypt.verifyPassword(password, encryptedPass); } /** * Rescans the users file. * * @return the updated Map of users. */ public static Map scanUsers() { String fileName = Play.configuration.getProperty("authfile.users.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); Logger.info("@" + System.currentTimeMillis() + " Scanning Users in " + fileName); Map users = new HashMap(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); /* * Matches * user:hash * user:hash:uid: ... */ if (parts.length > 1) { users.put(parts[0].trim(), parts[1].trim()); } } Cache.set(AUTH_FILE_USERS_CACHE_KEY, users, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + users.size() + " mappings"); return users; } /** * Rescans the groups file. * * @return the updated Map of groups. */ public static Map> scanGroups() { String fileName = Play.configuration.getProperty("authfile.groups.path"); String delimeter1 = Play.configuration.getProperty("authfile.users.delimeter", ":"); String delimeter2 = Play.configuration.getProperty("authfile.groups.delimeter", " "); Logger.info("@" + System.currentTimeMillis() + " Scanning Groups in " + fileName); Map> groups = new HashMap>(); File file = new File(fileName); if (file == null || !file.exists() || !file.isFile()) { Logger.warn(fileName + " is not a valid Auth-File!"); } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String parts[]; String userParts[]; Set users; while ((line = br.readLine()) != null) { parts = line.split(delimeter1); if (parts.length > 1) { if (parts.length > 2) { userParts = parts[parts.length - 1].split(delimeter2); } else { userParts = parts[1].split(delimeter2); } if (userParts.length > 0) { users = new HashSet(); for (String user : userParts) { users.add(user.trim()); } groups.put(parts[0].trim(), users); } } } Cache.set(AUTH_FILE_GROUPS_CACHE_KEY, groups, CACHE_TIMEOUT); } catch (FileNotFoundException ex) { Logger.error(ex.getLocalizedMessage(), ex); } catch (IOException ex) { Logger.error(ex.getLocalizedMessage(), ex); } Logger.info("found " + groups.size() + " mappings"); return groups; } private static boolean isEnabled() { if (Play.configuration.getProperty("authfile.users.path") == null || Play.configuration.getProperty("authfile.groups.path") == null) { Logger.info("FileAuth not enabled. authfile.users.path or authfile.groups.path not set!"); return false; } return true; } } PK*9D4^Isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.java/** * FileAuthPlugin * 31.07.2012 * @author Philipp Haussleiter * */ package play.modules.fileauth; import play.PlayPlugin; /** * Entry Class for first file scan. * @author Philipp Haußleiter */ public class FileAuthPlugin extends PlayPlugin { /** * Trigger to scan the files for the first Time. */ @Override public void onApplicationStart() { ScanJob job = new ScanJob(); job.now(); } } PK*9DY΁11Isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.java/* MD5Crypt.java Created: 3 November 1999 Java Port By: Jonathan Abbey, jonabbey@arlut.utexas.edu Original C Version: ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp ---------------------------------------------------------------------------- This Java Port is Copyright (c) 1999-2010 The University of Texas at Austin. All rights reserved. Redistribution and use in source and binary form are permitted provided that distributions retain this entire copyright notice and comment. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package play.modules.fileauth.utils; import java.security.MessageDigest; /*------------------------------------------------------------------------------ class MD5Crypt ------------------------------------------------------------------------------*/ /** * This class defines a method, * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible * md5-encoded password entry. */ public final class MD5Crypt { /** * Command line test rig. */ static public void main(String argv[]) { if ((argv.length < 1) || (argv.length > 3)) { System.err.println("Usage: MD5Crypt [-apache] password salt"); System.exit(1); } if (argv.length == 3) { System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2])); } else if (argv.length == 2) { System.err.println(MD5Crypt.crypt(argv[0], argv[1])); } else { System.err.println(MD5Crypt.crypt(argv[0])); } System.exit(0); } public static final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; public static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String to64(long v, int size) { StringBuilder result = new StringBuilder(); while (--size >= 0) { result.append(itoa64.charAt((int) (v & 0x3f))); v >>>= 6; } return result.toString(); } public static final void clearbits(byte bits[]) { for (int i = 0; i < bits.length; i++) { bits[i] = 0; } } /** * convert an encoded unsigned byte value into a int * with the unsigned value. */ public static final int bytes2u(byte inp) { return (int) inp & 0xff; } static private MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (java.security.NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.crypt(password, salt.toString()); } /** *

This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field. */ public static final String crypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$1$"); } /** *

This method generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password) { StringBuilder salt = new StringBuilder(); java.util.Random randgen = new java.util.Random(); /* -- */ while (salt.length() < 8) { int index = (int) (randgen.nextFloat() * SALTCHARS.length()); salt.append(SALTCHARS.substring(index, index + 1)); } return MD5Crypt.apacheCrypt(password, salt.toString()); } /** *

This method actually generates an Apache MD5 compatible * md5-encoded password hash from a plaintext password and a * salt.

* *

The resulting string will be in the form '$apr1$<salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start with $apr1$, which * will be ignored. It is explicitly permitted to pass a pre-existing * MD5Crypt'ed password entry as the salt. crypt() will strip the salt * chars out properly. * * @return An Apache-compatible md5-hashed password string. */ public static final String apacheCrypt(String password, String salt) { return MD5Crypt.crypt(password, salt, "$apr1$"); } /** *

This method actually generates md5-encoded password hash from * a plaintext password, a salt, and a magic string.

* *

There are two magic strings that make sense to use here.. '$1$' is the * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.

* *

The resulting string will be in the form '<magic><salt>$<hashed mess>

* * @param password Plaintext password * @param salt A short string to use to randomize md5. May start * with the magic string, which will be ignored. It is explicitly * permitted to pass a pre-existing MD5Crypt'ed password entry as * the salt. crypt() will strip the salt chars out properly. * @param magic Either "$apr1$" or "$1$", which controls whether we * are doing Apache-style or FreeBSD-style md5Crypt. * * @return An md5-hashed password string. */ public static final String crypt(String password, String salt, String magic) { /* This string is magic for this algorithm. Having it this way, * we can get get better later on */ byte finalState[]; MessageDigest ctx, ctx1; long l; /* -- */ /* Refine the Salt first */ /* If it starts with the magic string, then skip that */ if (salt.startsWith(magic)) { salt = salt.substring(magic.length()); } /* It stops at the first '$', max 8 chars */ if (salt.indexOf('$') != -1) { salt = salt.substring(0, salt.indexOf('$')); } if (salt.length() > 8) { salt = salt.substring(0, 8); } ctx = getMD5(); ctx.update(password.getBytes()); // The password first, since that is what is most unknown ctx.update(magic.getBytes()); // Then our magic string ctx.update(salt.getBytes()); // Then the raw salt /* Then just as many characters of the MD5(pw,salt,pw) */ ctx1 = getMD5(); ctx1.update(password.getBytes()); ctx1.update(salt.getBytes()); ctx1.update(password.getBytes()); finalState = ctx1.digest(); for (int pl = password.length(); pl > 0; pl -= 16) { ctx.update(finalState, 0, pl > 16 ? 16 : pl); } /* the original code claimed that finalState was being cleared to keep dangerous bits out of memory, but doing this is also required in order to get the right output. */ clearbits(finalState); /* Then something really weird... */ for (int i = password.length(); i != 0; i >>>= 1) { if ((i & 1) != 0) { ctx.update(finalState, 0, 1); } else { ctx.update(password.getBytes(), 0, 1); } } finalState = ctx.digest(); /* * and now, just to make sure things don't run too fast * On a 60 Mhz Pentium this takes 34 msec, so you would * need 30 seconds to build a 1000 entry dictionary... * * (The above timings from the C version) */ for (int i = 0; i < 1000; i++) { ctx1.reset(); if ((i & 1) != 0) { ctx1.update(password.getBytes()); } else { ctx1.update(finalState, 0, 16); } if ((i % 3) != 0) { ctx1.update(salt.getBytes()); } if ((i % 7) != 0) { ctx1.update(password.getBytes()); } if ((i & 1) != 0) { ctx1.update(finalState, 0, 16); } else { ctx1.update(password.getBytes()); } finalState = ctx1.digest(); } /* Now make the output string */ StringBuilder result = new StringBuilder(); result.append(magic); result.append(salt); result.append("$"); l = (bytes2u(finalState[0]) << 16) | (bytes2u(finalState[6]) << 8) | bytes2u(finalState[12]); result.append(to64(l, 4)); l = (bytes2u(finalState[1]) << 16) | (bytes2u(finalState[7]) << 8) | bytes2u(finalState[13]); result.append(to64(l, 4)); l = (bytes2u(finalState[2]) << 16) | (bytes2u(finalState[8]) << 8) | bytes2u(finalState[14]); result.append(to64(l, 4)); l = (bytes2u(finalState[3]) << 16) | (bytes2u(finalState[9]) << 8) | bytes2u(finalState[15]); result.append(to64(l, 4)); l = (bytes2u(finalState[4]) << 16) | (bytes2u(finalState[10]) << 8) | bytes2u(finalState[5]); result.append(to64(l, 4)); l = bytes2u(finalState[11]); result.append(to64(l, 2)); /* Don't leave anything around in vm they could use. */ clearbits(finalState); return result.toString(); } /** * This method tests a plaintext password against a md5Crypt'ed hash and returns * true if the password matches the hash. * * This method will work properly whether the hashtext was crypted * using the default FreeBSD md5Crypt algorithm or the Apache * md5Crypt variant. * * @param plaintextPass The plaintext password text to test. * @param md5CryptText The Apache or FreeBSD-md5Crypted hash used to authenticate the plaintextPass. */ public static final boolean verifyPassword(String plaintextPass, String md5CryptText) { if (md5CryptText.startsWith("$1$")) { return md5CryptText.equals(MD5Crypt.crypt(plaintextPass, md5CryptText)); } else if (md5CryptText.startsWith("$apr1$")) { return md5CryptText.equals(MD5Crypt.apacheCrypt(plaintextPass, md5CryptText)); } else { throw new RuntimeException("Bad md5CryptText"); } } } PK*9D5KAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.java/** * AuthFileSecurity * 31.07.2012 * @author Philipp Haussleiter * */ package controllers; import java.util.Map; import play.modules.fileauth.FileAuth; /** * This Class provides basice Security Functions for the Play! Security Plugin. * @author Philipp Haußleiter *

* Usage: * @With(Secure.class) * public class Application extends Controller { * ... * } * *

*/ public class AuthFileSecurity extends Secure.Security { /** * Authentify an user against the given AuthFile. * @param username the given username. * @param password the given password. * @return true if username and password matches, otherwise false. */ public static boolean authentify(String username, String password) { Map users = FileAuth.getUsers(); String userPassword = users.get(username.toLowerCase()); return userPassword.equals(password); } /** * Checks if the current user (that is loged in) has the profile (e.g. is in the group). * @param profile * @return true if the current user has the profile, otherwise false. */ public static boolean check(String profile) { String user = connected(); return FileAuth.contains(profile, user); } } PK*9D&=samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textileh1. {module name} p(note). Write your module documentation in this file, possibly linking to other Textile files, and delete these notes when you are finished. p(note). Start with a clear statement of what the module is and what it is for. Link to any third-party libraries that the module is based on. p(note). Briefly describe why you might want to use this module in a Play application. h2. Sample application p(note). Your module should contain a sample app in the @sample@ directory that demonstrates the module. Describe how to run the demo here. h2. Getting started p(note). Describe any installation that is required, beyond adding and resolving the module dependency. h2. Configuration p(note). List any configuration options that the module uses, with an @h3.@ heading for each one. h2. Usage p(note). Explain how to use the module, and describe any routes, controllers, models or views that the module provides. h2. Tags p(note). List any tags the module provides, with an @h3.@ heading for each one. Include the tags’ arguments. h2. Commands p(note). List any commands the module provides, with an @h3.@ heading for each one. Include the commands’ options. PK*9DVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<QIDATxڔSNA=U]5]=1aghf+0 n\gҿp#4?`t WFH$H$dGwoM+{O53^sIJBn18C_fG8k#7hB,KMSrMwav^i4v< +"mJQea+edקzY2(cFp` AB5ܧ"eV(<!D.7.f~#HU84@").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);PK*9DXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<Jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsroot: root apacheRoot users: root apacheRoot user apacheUserPK*9D(9  Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.java import org.junit.Test; import play.Logger; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * EncryptionTest * 31.07.2012 * @author Philipp Haussleiter * */ public class EncryptionTest extends UnitTest { @Test public void testApacheCrypt() { Logger.info("testing APACHE_CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.apacheCrypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.apacheCrypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testCrypt() { Logger.info("testing CRYPT"); String clear = "pw_" + System.currentTimeMillis(); String pass; String salt = "abcd1234"; pass = MD5Crypt.crypt(clear); Logger.info(clear + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); pass = MD5Crypt.crypt(clear, salt); Logger.info(clear + " & salt " + salt + " got me " + pass); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } } PK*9D7?IIVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ApacheUsersTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/htusers"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "apacheUser"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DĞVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * GroupGroupsTest * 04.08.2012 * @author Philipp Haussleiter * */ public class GroupGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/group"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", ","); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } }PK*9Dd s*Vsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.java import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.modules.fileauth.utils.MD5Crypt; import play.test.UnitTest; /** * ShadowUsersTest * 04.08.2012 * @author Philipp Haussleiter * */ public class ShadowUsersTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.users.path", Play.applicationPath + "/test/shadow"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Cache.safeDelete(FileAuth.AUTH_FILE_USERS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanUsers(); Map users = Cache.get(FileAuth.AUTH_FILE_USERS_CACHE_KEY, HashMap.class); assertNotNull(users); } @Test public void testUsersValidate() { String clear = "user"; String pass = MD5Crypt.crypt("user"); assertTrue(MD5Crypt.verifyPassword(clear, pass)); } @Test public void testValidatePassword() { String pass = "user"; String user = "user"; assertTrue(FileAuth.validate(user, pass)); user = "user"; pass = "user123"; assertFalse(FileAuth.validate(user, pass)); } @Test public void testValidateNotExistingUser() { String pass = "user123"; String user = "user123"; assertFalse(FileAuth.validate(user, pass)); } } PK*9DT %%Gsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/grouproot:x:321:root users:x:123:root,userPK*9DcJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.yml# you describe your data using the YAML notation here # and then load them using Fixtures.load("data.yml") # User(bob): # email: bob@gmail.com # password: secret # fullname: BobPK*9D<_'Isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersapacheUser:$apr1$kuwPretH$BPbVoWoDTEFUw.4g1zDKs1 apacheRoot:$apr1$nVmU2aOS$rDZ4.BG3TPT02YBsCVcSG/ root:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E. user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771 PK*9DǁPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaimport org.junit.*; import play.test.*; public class BasicTest extends UnitTest { @Test public void aVeryImportantThingToTest() { assertEquals(2, 1 + 1); } } PK*9D=uuHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowroot:$1$imw51D2V$aJbVmk2xlEg8q.Y8nh91E.:43534:0:435:7::: user:$1$4aMItwK9$PnpH2GeuHDeR2t.jKhQ771:345345:0:46456:7::: PK*9D,Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.java import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.BeforeClass; import org.junit.Test; import play.Play; import play.cache.Cache; import play.modules.fileauth.FileAuth; import play.test.UnitTest; /** * ApacheGroupsTest * 03.08.2012 * @author Philipp Haussleiter * */ public class ApacheGroupsTest extends UnitTest { @BeforeClass public static void setup() { Play.configuration.setProperty("authfile.groups.path", Play.applicationPath + "/test/htgroups"); Play.configuration.setProperty("authfile.users.delimeter", ":"); Play.configuration.setProperty("authfile.groups.delimeter", " "); Cache.safeDelete(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY); } @Test public void testUsersRead() { FileAuth.scanGroups(); Map> groups = Cache.get(FileAuth.AUTH_FILE_GROUPS_CACHE_KEY, HashMap.class); assertNotNull(groups); } @Test public void testGroupContainsUser() { String user = "user"; String group = "users"; assertTrue(FileAuth.contains(group, user)); user = "root"; assertTrue(FileAuth.contains(group, user)); } @Test public void testGroupNotContainsUser() { String user = "user"; String group = "root"; assertFalse(FileAuth.contains(group, user)); } public void testGroupNotExists() { String user = "user"; String group = "user"; assertFalse(FileAuth.contains(group, user)); } } PK*9D/%BHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routes# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action} PK*9D#/Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.conf# This is the main configuration file for the application. # ~~~~~ application.name=auth-file-demo # Application mode # ~~~~~ # Set to dev to enable instant reloading and other development help. # Otherwise set to prod. application.mode=dev %prod.application.mode=prod # Secret key # ~~~~~ # The secret key is used to secure cryptographics functions # If you deploy your application to several instances be sure to use the same key ! application.secret=uQks53MboMLlGVsJSrPRCipiFOZ4BXn8oDBfOxGxsaXDVtkJOJaIiBNX9SNQoUN8 # i18n # ~~~~~ # Define locales used by your application. # You can then place localized messages in conf/messages.{locale} files # application.langs=fr,en,ja # Date format # ~~~~~ date.format=yyyy-MM-dd # date.format.fr=dd/MM/yyyy # Server configuration # ~~~~~ # If you need to change the HTTP port, uncomment this (default is set to 9000) # http.port=9000 # # By default the server listen for HTTP on the wilcard address. # You can restrict this. # http.address=127.0.0.1 # # Use this if you don't host your Play application at the root of the domain # you're serving it from. This parameter has no effect when deployed as a # war, because the path will be handled by the application server. # http.path=/ # Session configuration # ~~~~~~~~~~~~~~~~~~~~~~ # By default, session will be written to the transient PLAY_SESSION cookie. # The cookies are not secured by default, only set it to true # if you're serving your pages through https. # application.session.cookie=PLAY # application.session.maxAge=1h # application.session.secure=false # Session/Cookie sharing between subdomain # ~~~~~~~~~~~~~~~~~~~~~~ # By default a cookie is only valid for a specific domain. By setting # application.defaultCookieDomain to '.example.com', the cookies # will be valid for all domains ending with '.example.com', ie: # foo.example.com and bar.example.com # application.defaultCookieDomain=.example.com # JVM configuration # ~~~~~ # Define which port is used by JPDA when application is in debug mode (default is set to 8000) # jpda.port=8000 # # Java source level => 1.5, 1.6 or 1.7 (experimental) # java.source=1.5 # Log level # ~~~~~ # Specify log level for your application. # If you want a very customized log, create a log4j.properties file in the conf directory # application.log=INFO # # More logging configuration # application.log.path=/log4j.properties # application.log.system.out=off # Database configuration # ~~~~~ # Enable a database engine if needed. # # To quickly set up a development database, use either: # - mem : for a transient in memory database (H2 in memory) # - fs : for a simple file written database (H2 file stored) # db=mem # # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database # # To connect to a local PostgreSQL9 database, use: # db=postgres://user:pwd@host/database # # If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secret # # Connections pool configuration : # db.pool.timeout=1000 # db.pool.maxSize=30 # db.pool.minSize=10 # # If you want to reuse an existing Datasource from your application server, use: # db=java:/comp/env/jdbc/myDatasource # # When using an existing Datasource, it's sometimes needed to destroy it when # the application is stopped. Depending on the datasource, you can define a # generic "destroy" method : # db.destroyMethod=close # JPA Configuration (Hibernate) # ~~~~~ # # Specify the custom JPA dialect to use here (default to guess): # jpa.dialect=org.hibernate.dialect.PostgreSQLDialect # # Specify the ddl generation pattern to use. Set to none to disable it # (default to update in DEV mode, and none in PROD mode): # jpa.ddl=update # # Debug SQL statements (logged using DEBUG level): # jpa.debugSQL=true # # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... # # Store path for Blob content attachments.path=data/attachments # Memcached configuration # ~~~~~ # Enable memcached if needed. Otherwise a local cache is used. # memcached=enabled # # Specify memcached host (default to 127.0.0.1:11211) # memcached.host=127.0.0.1:11211 # # Or you can specify multiple host to build a distributed cache # memcached.1.host=127.0.0.1:11211 # memcached.2.host=127.0.0.1:11212 # # Use plain SASL to authenticate for memcached # memcached.user= # memcached.password= # HTTP Response headers control for static files # ~~~~~ # Set the default max-age, telling the user's browser how long it should cache the page. # Default is 3600 (one hour). Set it to 0 to send no-cache. # This is only read in prod mode, in dev mode the cache is disabled. # http.cacheControl=3600 # If enabled, Play will generate entity tags automatically and send a 304 when needed. # Default is true, set it to false to deactivate use of entity tags. # http.useETag=true # Custom mime types # mimetype.xpi=application/x-xpinstall # WS configuration # ~~~~~ # Default engine is Async Http Client, uncomment to use # the JDK's internal implementation # webservice = urlfetch # If you need to set proxy params for WS requests # http.proxyHost = localhost # http.proxyPort = 3128 # http.proxyUser = jojo # http.proxyPassword = jojo # Mail configuration # ~~~~~ # Default is to use a mock Mailer mail.smtp=mock # Or, specify mail host configuration # mail.smtp.host=127.0.0.1 # mail.smtp.user=admin # mail.smtp.pass= # mail.smtp.channel=ssl # Url-resolving in Jobs # ~~~~~~ # When rendering templates with reverse-url-resoling (@@{..}) in Jobs (which do not have an inbound Http.Request), # ie if sending a HtmlMail, Play need to know which url your users use when accessing your app. # %test.application.baseUrl=http://localhost:9000/ # %prod.application.baseUrl=http://www.yourdomain.com/ # Jobs executor # ~~~~~~ # Size of the Jobs pool # play.jobs.pool=10 # Execution pool # ~~~~~ # Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode. # Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose) # play.pool=3 # Open file from errors pages # ~~~~~ # If your text editor supports opening files by URL, Play! will # dynamically link error pages to files # # Example, for textmate: # play.editor=txmt://open?url=file://%s&line=%s # Testing. Set up a custom configuration for test mode # ~~~~~ #%test.module.cobertura=${play.path}/modules/cobertura %test.application.mode=dev %test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0 %test.jpa.ddl=create %test.mail.smtp=mock PK*9DW  Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.yml# Application dependencies require: - play - play -> secure - local -> play-file-auth 0.2 repositories: - playCustomModules: type: local artifact: ${application.path}/../../dist/[module]-[revision].zip contains: - local -> *PK*9DqhhJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messages# You can specialize this file for each language. # For example, for French create a messages.fr file # PK*9D_^)//Psamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.html #{get 'title' /} #{get 'moreStyles' /} #{get 'moreScripts' /} #{doLayout /} PK*9D*$<<]samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.html#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}PK*9DVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.html Not found #{if play.mode.name() == 'DEV'} #{404 result /} #{/if} #{else}

Not found

${result.message}

#{/else} PK*9DipVVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.html Application error #{if play.mode.name() == 'DEV'} #{500 exception /} #{/if} #{else}

Oops, an error occured

#{if exception instanceof play.exceptions.PlayException}

This exception has been logged with id ${exception.id}.

#{/if} #{/else} PK*9D8r]samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javapackage controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }PK*9Dpb$$Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$vsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PK*9Dpb$$Jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PKˆMDpb$$modules/secure/opt/play/play-1.2.5/modules/secure PKoCD6IPP commands.pyPKoCZ yREADME.mdPKoCaCVV 5build.xmlPKÈMDxϑ[$$ manifestPKÈMD@>@> lib/play-play-file-auth.jarPKoCQ.^ uJconf/routesPKoC1S*TT|Kconf/application.confPKoC(JJLconf/dependencies.ymlPKoC;U Lconf/messagesPKoCWMsrc/play.pluginsPKoC6&Msrc/play/modules/fileauth/ScanJob.javaPKMDDtt'bOsrc/play/modules/fileauth/FileAuth.javaPKoC4^-msrc/play/modules/fileauth/FileAuthPlugin.javaPKMDk*00- osrc/play/modules/fileauth/utils/MD5Crypt.javaPKMD+<|ćOO.csrc/play/modules/fileauth/utils/UnixCrypt.javaPKą9D*F>>6javadoc/package-listPKą9D*xjavadoc/overview-tree.htmlPKą9Dlnn javadoc/allclasses-noframe.htmlPKą9D?MooXjavadoc/stylesheet.cssPKą9DY##javadoc/help-doc.htmlPKą9D-vDC:javadoc/allclasses-frame.htmlPKą9DU>@javadoc/constant-values.htmlPKą9D*T^javadoc/overview-frame.htmlPKą9DqXvJvJcjavadoc/index-all.htmlPKą9D֦p?javadoc/index.htmlPKą9Dejavadoc/overview-summary.htmlPKą9D7javadoc/deprecated-list.htmlPKą9DM99javadoc/resources/inherit.gifPKÅ9DڰN??+pjavadoc/play/modules/fileauth/FileAuth.htmlPKą9D<8/javadoc/play/modules/fileauth/package-tree.htmlPKą9D[25javadoc/play/modules/fileauth/package-summary.htmlPKą9D{440Ojavadoc/play/modules/fileauth/package-frame.htmlPKÅ9D#˾++*Sjavadoc/play/modules/fileauth/ScanJob.htmlPKÅ9DfҊ--1javadoc/play/modules/fileauth/FileAuthPlugin.htmlPKą9Drnmm5javadoc/play/modules/fileauth/utils/package-tree.htmlPKÅ9Do1TT1Gjavadoc/play/modules/fileauth/utils/MD5Crypt.htmlPKą9DO8djavadoc/play/modules/fileauth/utils/package-summary.htmlPKą9D`/~~61javadoc/play/modules/fileauth/utils/package-frame.htmlPKÅ9D0?T5javadoc/controllers/Check.htmlPKą9D)|%Rjavadoc/controllers/package-tree.htmlPKÅ9D0O*O*(jjavadoc/controllers/Secure.Security.htmlPKÅ9DZ22)jjavadoc/controllers/AuthFileSecurity.htmlPKÅ9D6éG5G5javadoc/controllers/Secure.htmlPKą9D&G(javadoc/controllers/package-summary.htmlPKą9D.^&]javadoc/controllers/package-frame.htmlPKoC5K%app/controllers/AuthFileSecurity.javaPKoC&!!documentation/manual/home.textilePKoC:&samples-and-tests/auth-file-demo/public/images/favicon.pngPKoC |;ffG)samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPKoC<Psamples-and-tests/auth-file-demo/public/stylesheets/main.cssPKoC_5<<.samples-and-tests/auth-file-demo/test/htgroupsPKoC(9  92samples-and-tests/auth-file-demo/test/EncryptionTest.javaPKSC*,-II:samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPKoCĞ:5samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPKSC?5'gg:samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPKoCT %%+Esamples-and-tests/auth-file-demo/test/groupPKoCc.samples-and-tests/auth-file-demo/test/data.ymlPKoC<_'-samples-and-tests/auth-file-demo/test/htusersPKoCǁ4samples-and-tests/auth-file-demo/test/BasicTest.javaPKoC=uu,ƭsamples-and-tests/auth-file-demo/test/shadowPKSC,m;samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPKoC/%B,շsamples-and-tests/auth-file-demo/conf/routesPKoC#/6samples-and-tests/auth-file-demo/conf/application.confPKCW  6samples-and-tests/auth-file-demo/conf/dependencies.ymlPKoCqhh.samples-and-tests/auth-file-demo/conf/messagesPKoC_^)//46samples-and-tests/auth-file-demo/app/views/main.htmlPKoC*$<<Asamples-and-tests/auth-file-demo/app/views/Application/index.htmlPKoC:Rsamples-and-tests/auth-file-demo/app/views/errors/404.htmlPKoCipVV:Psamples-and-tests/auth-file-demo/app/views/errors/500.htmlPKoC8rAsamples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPPGasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVVEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9DOHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9DG-Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^Gsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TTQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;UIxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9DLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlPcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^it2samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11i4samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D*F>>PVfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/package-listPK*9DVgsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/overview-tree.htmlPK*9D:Vtoo[Fsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/allclasses-noframe.htmlPK*9D?MooR.samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/stylesheet.cssPK*9D##Q samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/help-doc.htmlPK*9DoAYsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/allclasses-frame.htmlPK*9DVXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/constant-values.htmlPK*9DA WTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/overview-frame.htmlPK*9D8wJwJRsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/index-all.htmlPK*9D N&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/index.htmlPK*9D^}ɀYv,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/overview-summary.htmlPK*9DaYWYXmBsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/deprecated-list.htmlPK*9DM99YUsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/resources/inherit.gifPK*9DT??gVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/FileAuth.htmlPK*9DPk0samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/package-tree.htmlPK*9DQnsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/package-summary.htmlPK*9Dp&55lsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/package-frame.htmlPK*9DeQ磿++fsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/ScanJob.htmlPK*9Du f--msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/FileAuthPlugin.htmlPK*9Dzznnq+(samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/package-tree.htmlPK*9DdTTm(?samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/MD5Crypt.htmlPK*9Dߤ{tsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/package-summary.htmlPK*9DFrݬsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/play/modules/fileauth/utils/package-frame.htmlPK*9D]" Zsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/Check.htmlPK*9Dausamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/package-tree.htmlPK*9DkP*P*dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/Secure.Security.htmlPK*9Dځ22e samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/AuthFileSecurity.htmlPK*9DH5H5["E samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/Secure.htmlPK*9D dz samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/package-summary.htmlPK*9DVbc samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/javadoc/controllers/package-frame.htmlPK*9D5Ka samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&]k samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9Dv samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ffͧ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9Dx samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<j samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  u samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-IIv{ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞvX samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'ggv" samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%g) samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9Dcj* samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'i+ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9Dǁp- samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uuhQ. samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,mwL/ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%Bh8 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/r2; samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  rU samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhhj9W samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//p)X samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<}Z samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9Dv[ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVVv] samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8r}` samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$kb samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPPb samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZf samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVVh samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9DK o samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$Nv samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9D}bw samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^| samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TT samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;U samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9D> samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlP9 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^۸ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11X samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5K5 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D& samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9D@ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ff samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9Db samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<c samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  d samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-II]j samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞvq samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'gg?x samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%v samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9Dc\ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'؁ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9DǁM samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uuׄ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,m samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%B֏ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/l samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW   samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhh samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)// samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<< samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9D# samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVV samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8r samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$) samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPP samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZ? samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVV samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9D samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9D" samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^: samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TT samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJ0 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;Ua samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9D samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlP_ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^=samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5KJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&Osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9DUsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ffMYsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9D{samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞ0samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'gg5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9Dǁ3samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,mlsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%Bpsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhh9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9D%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8r9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZm#samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVV&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9D%o-samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$v4samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9D# 5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^Ssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TTUsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJWsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;UoXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9D6Zsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6T[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlP!^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^;{samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁110~samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9D*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ff7wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9D,'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<+)samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  )*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-II*0samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞ*8samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'gg*?samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%vGsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9DcHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'Jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9Dǁ$Lsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uuNsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,m+fPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%BZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/&]samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  &xsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhh#{samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//$|samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<18samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9D*Ásamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVV*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8r1Osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPP7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZ57samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVV5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9Da8Țsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$4samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9D@óGjsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TTAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJApsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;U9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9D<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6Rvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlPSsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5KQ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&M&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9Df -samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ffs=1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9Dhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<Zisamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  esamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-IIfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞfxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'ggfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9DcZzsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'Ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9Dǁ`ӿsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uuXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,mgsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%BXxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  b samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9DqhhZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<m6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9Dfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVVf'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8rmsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPPssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVVq samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9Dnxtsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$psamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^s9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TT};samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJ}z=samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;Uu_?samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9DxAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D64Csamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlPyFsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^ dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11xgsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5KEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9D0samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ffsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<Csamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  3samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞ&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'gg-samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9Dc7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'(:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9Dǁ<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uu?samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,m.Asamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%BKsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/lOsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhhmsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<ssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9Dusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVV9ysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8rO}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9DN samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9D0㕻Λsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^fsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJ<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;U]samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlP+samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9D+samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ff/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9Dחsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<ՙsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D*,-IIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9D?5'ggAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9Dcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9Dǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uusamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,msamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%B samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9Dasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8rUsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPP samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZYsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9DE:Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$N$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9D"YOx&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^LEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TT3Hsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;ULsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9DOsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6Qsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlPyUsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^ ssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11 hwsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&űsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ff'osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9D%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<(samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  k*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D7?II1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞ.:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9Dd s*_Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %% Jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9DcLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_' Osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9DǁRsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uu Usamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,0Xsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%B h`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/fdsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  asamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9Dqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//Isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<!samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9D%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8r!samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$csamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9DD6IPP'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPK*9DZ%Isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPK*9DaCVV%!samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPK*9Deme(samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPK*9Dxϑ[$$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPK*9Duv-7Xsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPK*9DQ.^'hsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPK*9D1S*TT1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPK*9D(JJ1.samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPK*9D;U)samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPK*9D,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPK*9D6Bsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPK*9DlPCsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPK*9D4^ICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPK*9DY΁11Id samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPK*9D5KA=samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPK*9D&=9Esamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePK*9DV8Lsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPK*9D |;ffc[Qsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPK*9DXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPK*9D_5<<Jgsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPK*9D(9  U samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPK*9D7?IIVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPK*9DĞVFsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPK*9Dd s*Vsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPK*9DT %%G samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPK*9DcJsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPK*9D<_'Isamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPK*9DǁPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPK*9D=uuHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPK*9D,Wsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPK*9D/%BH`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPK*9D#/Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPK*9DW  Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPK*9DqhhJasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPK*9D_^)//P1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPK*9D*$<<]"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPK*9DV%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPK*9DipVVV)samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPK*9D8r]i.samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPK*9Dpb$$Kw1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePK*9Dpb$$*4samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$p6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$8samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$v:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$:L<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$=samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$?samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$ @samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePK*9Dpb$$J@samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePKˆMDpb$$`Amodules/securePK|cA