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
PKCxϑ[$$manifestversion=0.2 frameworkVersions=1.2.x PKC}blib/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 PKoCQ.^ 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.indexPKoC1S*TTconf/application.confapplication.name=play-file-auth application.mode=dev application.secret=test db=mem PKoC(JJconf/dependencies.ymlself: play -> 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(); } } PKoClP'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; } } 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(); } } PKoCY΁11-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"); } } } 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(); } }PKICpb$$/samples-and-tests/auth-file-demo/modules/secure/opt/play/play-1.2.5/modules/secure PKICD6IPPGsamples-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 PKICZEsamples-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$...PKICaCVVEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xml
PKICHsamples-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  PKICxϑ[$$Dsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestversion=0.2 frameworkVersions=1.2.x PKIC"Wsamples-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 PKICQ.^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.indexPKIC1S*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 PKIC(JJQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlself: play -> play-file-auth 0.2 require: - play - play -> securePKIC;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-authPKICLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPKIC6bsamples-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(); } } PKIClPcsamples-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; } } PKIC4^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(); } } PKICY΁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"); } } } PKIC5Kasamples-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); } } PKIC&]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. PKICvsamples-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);PKICxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPKIC_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 apacheUserPKIC(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)); } } PKIC*,-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)); } } PKICĞ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)); } }PKIC?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)); } } PKICT %%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,userPKICcjsamples-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: BobPKIC<_'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 PKICǁ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); } } PKIC=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::: PKIC,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)); } } PKIC/%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} PKIC#/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 PKICW  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 -> *PKICqhhjsamples-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 # PKIC_^)//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 /} PKIC*$<<}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 /}PKICvsamples-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} PKICipVVvsamples-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} PKIC8r}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(); } }PKICpb$$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 PKICD6IPPsamples-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 PKICZsamples-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$...PKICaCVVsamples-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
PKIC%osamples-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  PKICxϑ[$$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 PKIC#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 PKICQ.^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.indexPKIC1S*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 PKIC(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 -> securePKIC;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-authPKICsamples-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.pluginsPKIC6samples-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(); } } PKIClPsamples-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; } } PKIC4^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(); } } PKICY΁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"); } } } PKIC5Ksamples-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); } } PKIC&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. PKICsamples-and-tests/auth-file-demo/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);PKICsamples-and-tests/auth-file-demo/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.cssPKIC_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 apacheUserPKIC(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)); } } PKIC*,-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)); } } PKICĞsamples-and-tests/auth-file-demo/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)); } }PKIC?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)); } } PKICT %%samples-and-tests/auth-file-demo/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,userPKICcsamples-and-tests/auth-file-demo/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: BobPKIC<_'samples-and-tests/auth-file-demo/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 PKICǁsamples-and-tests/auth-file-demo/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); } } PKIC=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::: PKIC,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)); } } PKIC/%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} PKIC#/samples-and-tests/auth-file-demo/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 PKICW  samples-and-tests/auth-file-demo/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 -> *PKICqhhsamples-and-tests/auth-file-demo/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 # PKIC_^)//samples-and-tests/auth-file-demo/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 /} PKIC*$<<samples-and-tests/auth-file-demo/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 /}PKICsamples-and-tests/auth-file-demo/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} PKICipVVsamples-and-tests/auth-file-demo/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} PKIC8rsamples-and-tests/auth-file-demo/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(); } }PKICpb$$samples-and-tests/auth-file-demo/modules/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 PKICD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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$...PKICaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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
PKICasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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  PKICxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKIC@ósamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.indexPKIC1S*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 PKIC(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 -> securePKIC;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-authPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKIClPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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; } } PKIC4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKICY΁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"); } } } PKIC5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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); } } PKIC&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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. PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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);PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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 apacheUserPKIC(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)); } } PKIC*,-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)); } } PKICĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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)); } }PKIC?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)); } } PKICT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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,userPKICcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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: BobPKIC<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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); } } PKIC=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::: PKIC,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)); } } PKIC/%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} PKIC#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 -> *PKICqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 # PKIC_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /} PKIC*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /}PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKICipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKIC8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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(); } }PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/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 PKICD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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$...PKICaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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
PKICnxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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  PKICxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKIC samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.indexPKIC1S*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 PKIC(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 -> securePKIC;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-authPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKIClPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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; } } PKIC4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKICY΁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"); } } } PKIC5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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); } } PKIC&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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. PKIC*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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);PKIC,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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 apacheUserPKIC(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)); } } PKIC*,-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)); } } PKICĞ*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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)); } }PKIC?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)); } } PKICT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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,userPKICcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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: BobPKIC<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICǁ$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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); } } PKIC=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::: PKIC,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)); } } PKIC/%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} PKIC#/&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICW  &samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 -> *PKICqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 # PKIC_^)//$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /} PKIC*$<<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 /}PKIC*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKICipVV*samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKIC8r1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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(); } }PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/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 PKICD6IPP7samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICZ5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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$...PKICaCVV5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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
PKICN8samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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  PKICxϑ[$$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 PKIC0㕻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 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 PKICQ.^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.indexPKIC1S*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 PKIC(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 -> securePKIC;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-authPKIC<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6Rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKIClPSsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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; } } PKIC4^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(); } } PKICY΁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"); } } } PKIC5KQsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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); } } PKIC&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. PKICfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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);PKIChsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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 apacheUserPKIC(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)); } } PKIC*,-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)); } } PKICĞ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)); } }PKIC?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)); } } PKICT %%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,userPKICcZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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: BobPKIC<_'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 PKICǁ`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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); } } PKIC=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::: PKIC,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)); } } PKIC/%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} PKIC#/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 PKICW  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 -> *PKICqhhZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 # PKIC_^)//`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /} PKIC*$<<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 /}PKICfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKICipVVfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKIC8rmsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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(); } }PKICpb$$[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/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 PKICD6IPPssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICZqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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$...PKICaCVVqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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
PKICE:tsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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  PKICxϑ[$$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 PKIC"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/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 PKICQ.^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.indexPKIC1S*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 PKIC(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 -> securePKIC;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-authPKICxsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKIClPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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; } } PKIC4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKICY΁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"); } } } PKIC5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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); } } PKIC&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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. PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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);PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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 apacheUserPKIC(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)); } } PKIC7?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); } @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)); } } PKICĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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)); } }PKICd 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/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)); } } PKICT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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,userPKICcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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: BobPKIC<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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); } } PKIC=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::: PKIC,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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)); } } PKIC/%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} PKIC#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 -> *PKICqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 # PKIC_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /} PKIC*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /}PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKICipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKIC8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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(); } }PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/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 PKICD6IPPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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$...PKICaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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
PKICemesamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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  PKICxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICuv-samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICQ.^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.indexPKIC1S*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 PKIC(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 -> securePKIC;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-authPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKIClPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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; } } PKIC4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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(); } } PKICY΁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"); } } } PKIC5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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); } } PKIC&samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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. PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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);PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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 apacheUserPKIC(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)); } } PKIC7?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); } @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)); } } PKICĞsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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)); } }PKICd 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/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)); } } PKICT %%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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,userPKICcsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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: BobPKIC<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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); } } PKIC=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::: PKIC,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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)); } } PKIC/%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} PKIC#/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 PKICW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 -> *PKICqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 # PKIC_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /} PKIC*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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 /}PKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKICipVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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} PKIC8rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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(); } }PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/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 PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICpb$$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 PKICpb$$:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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 PKICpb$$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 PKICpb$$Jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/secure/opt/play/play-1.2.5/modules/secure PKCpb$$modules/secure/opt/play/play-1.2.5/modules/secure PKoCD6IPP commands.pyPKoCZ yREADME.mdPKoCaCVV 5build.xmlPKCxϑ[$$ manifestPKC}b lib/play-play-file-auth.jarPKoCQ.^ (conf/routesPKoC1S*TT)conf/application.confPKoC(JJ~*conf/dependencies.ymlPKoC;U *conf/messagesPKoC+src/play.pluginsPKoC6&,src/play/modules/fileauth/ScanJob.javaPKoClP'-src/play/modules/fileauth/FileAuth.javaPKoC4^-Jsrc/play/modules/fileauth/FileAuthPlugin.javaPKoCY΁11- Lsrc/play/modules/fileauth/utils/MD5Crypt.javaPKoC5K%q}app/controllers/AuthFileSecurity.javaPKoC&!documentation/manual/home.textilePKoC:samples-and-tests/auth-file-demo/public/images/favicon.pngPKoC |;ffGsamples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPKoC< samples-and-tests/auth-file-demo/public/stylesheets/main.cssPKoC_5<<.gsamples-and-tests/auth-file-demo/test/htgroupsPKoC(9  9samples-and-tests/auth-file-demo/test/EncryptionTest.javaPKSC*,-II:Qsamples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPKoCĞ:samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPKSC?5'gg:Csamples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPKoCT %%+ samples-and-tests/auth-file-demo/test/groupPKoCc.p samples-and-tests/auth-file-demo/test/data.ymlPKoC<_'-t samples-and-tests/auth-file-demo/test/htusersPKoCǁ4q samples-and-tests/auth-file-demo/test/BasicTest.javaPKoC=uu,samples-and-tests/auth-file-demo/test/shadowPKSC,m;Bsamples-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  64samples-and-tests/auth-file-demo/conf/dependencies.ymlPKoCqhh.?6samples-and-tests/auth-file-demo/conf/messagesPKoC_^)//46samples-and-tests/auth-file-demo/app/views/main.htmlPKoC*$<<At9samples-and-tests/auth-file-demo/app/views/Application/index.htmlPKoC::samples-and-tests/auth-file-demo/app/views/errors/404.htmlPKoCipVV: <samples-and-tests/auth-file-demo/app/views/errors/500.htmlPKoC8rA>samples-and-tests/auth-file-demo/app/controllers/Application.javaPKICpb$$/?samples-and-tests/auth-file-demo/modules/securePKICD6IPPG@samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pyPKICZECsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/README.mdPKICaCVVEEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPKICHLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPKICxϑ[$$DRsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKIC"WFSsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/lib/play-play-file-auth.jarPKICQ.^Gvpsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/routesPKIC1S*TTQqsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/application.confPKIC(JJQ|rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/dependencies.ymlPKIC;UI5ssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/conf/messagesPKICLHtsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play.pluginsPKIC6btsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/ScanJob.javaPKIClPcvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuth.javaPKIC4^i1samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/FileAuthPlugin.javaPKICY΁11irsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/src/play/modules/fileauth/utils/MD5Crypt.javaPKIC5Kasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/app/controllers/AuthFileSecurity.javaPKIC&]samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/documentation/manual/home.textilePKICvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/images/favicon.pngPKIC |;ffsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/javascripts/jquery-1.6.4.min.jsPKICx;samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/public/stylesheets/main.cssPKIC_5<<j5<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htgroupsPKIC(9  u<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPKIC*,-IIvBsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheUsersTest.javaPKICĞvtIsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/GroupGroupsTest.javaPKIC?5'ggvPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ShadowUsersTest.javaPKICT %%gVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/groupPKICcjWsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/data.ymlPKIC<_'iXsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/htusersPKICǁpZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/BasicTest.javaPKIC=uuhm[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/shadowPKIC,mwh\samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/test/ApacheGroupsTest.javaPKIC/%Bhesamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/routesPKIC#/rNhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/application.confPKICW  rsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/dependencies.ymlPKICqhhjUsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/conf/messagesPKIC_^)//pEsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/main.htmlPKIC*$<<}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/Application/index.htmlPKICvوsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/404.htmlPKICipVVvsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/views/errors/500.htmlPKIC8r}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/app/controllers/Application.javaPKICpb$$k+samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePKICD6IPP؏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.pyPKICZɓ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.mdPKICaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/build.xmlPKIC%osamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/commands.pycPKICxϑ[$$jsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKIC#,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.jarPKICQ.^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/routesPKIC1S*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.confPKIC(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.ymlPKIC;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/messagesPKICZsamples-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.pluginsPKIC6samples-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.javaPKIClPUsamples-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.javaPKIC4^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.javaPKICY΁11tsamples-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.javaPKIC5KQsamples-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.javaPKIC& 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.textilePKIC\%samples-and-tests/auth-file-demo/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.pngPKIC |;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.jsPKIC͏samples-and-tests/auth-file-demo/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.cssPKIC_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/htgroupsPKIC(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.javaPKIC*,-IIysamples-and-tests/auth-file-demo/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.javaPKICĞsamples-and-tests/auth-file-demo/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.javaPKIC?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/test/ShadowUsersTest.javaPKICT %%samples-and-tests/auth-file-demo/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/groupPKICcxsamples-and-tests/auth-file-demo/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.ymlPKIC<_'samples-and-tests/auth-file-demo/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/htusersPKICǁ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/test/BasicTest.javaPKIC=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/shadowPKIC,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.javaPKIC/%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/routesPKIC#/samples-and-tests/auth-file-demo/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.confPKICW  samples-and-tests/auth-file-demo/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.ymlPKICqhhsamples-and-tests/auth-file-demo/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/messagesPKIC_^)//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/app/views/main.htmlPKIC*$<<,samples-and-tests/auth-file-demo/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.htmlPKIC?samples-and-tests/auth-file-demo/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.htmlPKICipVVsamples-and-tests/auth-file-demo/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.htmlPKIC8rsamples-and-tests/auth-file-demo/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.javaPKICpb$$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/securePKICD6IPP.samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pyPKICZ[samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.mdPKICaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.xmlPKICasamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pycPKICxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKIC@ósamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.jarPKICQ.^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/conf/routesPKIC1S*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.confPKIC(JJLsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.ymlPKIC;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/conf/messagesPKIC"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIClP{%samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC4^YBsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKICY΁11Esamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC5K+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/app/controllers/AuthFileSecurity.javaPKIC&}samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.textilePKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.pngPKIC |;ffisamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.jsPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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/htgroupsPKIC(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.javaPKIC*,-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.javaPKICĞ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/test/GroupGroupsTest.javaPKIC?5'ggQ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICT %% samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/groupPKICc samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKIC<_' samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/htusersPKICǁ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/test/BasicTest.javaPKIC=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/test/shadowPKIC,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/test/ApacheGroupsTest.javaPKIC/%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/conf/routesPKIC#/^ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.confPKICW  -; samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKICqhhU= samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/messagesPKIC_^)//> samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC*$<<A samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICAC samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICipVVE samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC8rUI samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICpb$$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/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePKICD6IPP 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/commands.pyPKICZP samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.mdPKICaCVV5S samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.xmlPKICnxZ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pycPKICxϑ[$$a samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKIC 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/lib/play-play-file-auth.jarPKICQ.^ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/routesPKIC1S*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/conf/application.confPKIC(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/conf/dependencies.ymlPKIC;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/conf/messagesPKICR samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6p samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIClP= samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC4^W samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKICY΁11L samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC5K samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC& samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.textilePKIC* samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.pngPKIC |;ff7 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.jsPKIC,T samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_5<<GV samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/htgroupsPKIC(9  )W samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC*,-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.javaPKICĞ*e samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC?5'gg*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/test/ShadowUsersTest.javaPKICT %%t samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/groupPKICcu samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKIC<_'w samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/htusersPKICǁ$y samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC=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/test/shadowPKIC,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.javaPKIC/%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/conf/routesPKIC#/&Њ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.confPKICW  &ۥ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKICqhh? samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/messagesPKIC_^)//$ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC*$<<1T samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC*߮ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICipVV*ͱ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC8r1k samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICpb$$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/securePKICD6IPP7 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pyPKICZ5S samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.mdPKICaCVV5; samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.xmlPKICN8 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pycPKICxϑ[$$4, samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKIC0㕻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/lib/play-play-file-auth.jarPKICQ.^7 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/routesPKIC1S*TTA samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.confPKIC(JJA samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.ymlPKIC;U9Q samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/messagesPKIC<T samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6R samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIClPS samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC4^Y  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKICY΁11Y> samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC5KQM samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC&M3T samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.textilePKICfBZ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.pngPKIC |;ffsu^ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.jsPKICh samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_5<<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/test/htgroupsPKIC(9  eU samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC*,-IIf samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICĞf samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC?5'ggf- samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICT %%W samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/groupPKICcZ samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKIC<_'Y samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/htusersPKICǁ` samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC=uuXI samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/shadowPKIC,mg4 samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC/%BX samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/routesPKIC#/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/application.confPKICW  bAsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKICqhhZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/messagesPKIC_^)//`samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC*$<<mn"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICf5$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICipVVf_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC8rm9+samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICpb$$[W-samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePKICD6IPPs.samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pyPKICZq3samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.mdPKICaCVVq6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.xmlPKICE:t>samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pycPKICxϑ[$$pbFsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKIC"YOHsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.jarPKICQ.^spfsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/routesPKIC1S*TT}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/conf/application.confPKIC(JJ}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/conf/dependencies.ymlPKIC;Uulsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/messagesPKICxnsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6psamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIClPssamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC4^_samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKICY΁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/src/play/modules/fileauth/utils/MD5Crypt.javaPKIC5Ksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC&9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.textilePKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.pngPKIC |;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.jsPKIC@samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_5<<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/test/htgroupsPKIC(9  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/samples-and-tests/auth-file-demo/test/EncryptionTest.javaPKIC7?IIQKsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICĞZSsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICd 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/test/ShadowUsersTest.javaPKICT %%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/test/groupPKICcdsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKIC<_'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/test/htusersPKICǁsisamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC=uuksamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/shadowPKIC,nsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC/%Busamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/routesPKIC#/Zysamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.confPKICW  ݔsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKICqhhsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/messagesPKIC_^)//ՙsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC*$<<samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICipVV'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC8r=samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICpb$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/securePKICD6IPPpsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pyPKICZsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.mdPKICaCVVsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.xmlPKICemesamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pycPKICxϑ[$$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/manifestPKICuv-samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.jarPKICQ.^Tsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/routesPKIC1S*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.confPKIC(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.ymlPKIC;UKsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/messagesPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.pluginsPKIC6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIClPsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC4^samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKICY΁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.javaPKIC5KGsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.javaPKIC&uNsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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.textilePKICTsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.pngPKIC |;ffYsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.jsPKICsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.cssPKIC_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/htgroupsPKIC(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.javaPKIC7?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.javaPKICĞ:samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICd 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/test/ShadowUsersTest.javaPKICT %%$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/groupPKICc6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKIC<_'samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/htusersPKICǁsamples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC=uu5samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/shadowPKIC,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKIC/%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/routesPKIC#/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/conf/application.confPKICW  samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.ymlPKICqhh-samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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/messagesPKIC_^)//samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC*$<<"samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC$samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKICipVV(samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.htmlPKIC8r,samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/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.javaPKICpb$$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/securePKICpb$$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/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePKICpb$$v|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/modules/securePKICpb$$:45samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/securePKICpb$$6samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/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/securePKICpb$$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/modules/securePKICpb$$8samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePKICpb$$J9samples-and-tests/auth-file-demo/modules/play-file-auth-0.2/modules/securePKCpb$$H:modules/securePKOO: