├── .eslintrc.js ├── .gitignore ├── Gruntfile.js ├── Procfile ├── README.md ├── app.js ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── media │ ├── css │ ├── fonts.css │ ├── mixins.less │ ├── reset.css │ ├── semantic.gs.less │ └── style.less │ ├── js │ ├── ender.overlay.js │ ├── jquery-1.11.1.js │ ├── jquery-1.11.1.min.js │ └── shorten.js │ ├── shorten.min.css │ └── shorten.min.js ├── routes.js ├── settings.default.js ├── shorten.js ├── tests.js └── views ├── developers.html ├── error.html ├── errors ├── 404.html ├── 500.html └── error.html ├── index.html ├── layout.html └── setLink-response.html /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "node": true, 4 | "es6": true, 5 | "mocha": true, 6 | "phantomjs": true 7 | }, 8 | "plugins": [ 9 | "html" 10 | ], 11 | "globals":{ 12 | "inject": true, 13 | "chai": true 14 | }, 15 | "extends": "eslint:recommended", 16 | "parserOptions": { 17 | "sourceType": "module" 18 | }, 19 | "rules": { 20 | "accessor-pairs": 2, 21 | "array-bracket-spacing": [2, "never"], 22 | "array-callback-return": 2, 23 | "arrow-body-style": [2, "as-needed"], 24 | "arrow-parens": 2, 25 | "arrow-spacing": [2, {"before": true, "after": true}], 26 | "block-scoped-var": 2, 27 | "block-spacing": [2, "always"], 28 | "brace-style": [2, "1tbs", {"allowSingleLine": true}], 29 | "callback-return": 2, 30 | "camelcase": 0, 31 | "comma-spacing": [2, {"before": false, "after": true}], 32 | "comma-style": [2, "last"], 33 | "computed-property-spacing": [2, "never"], 34 | "consistent-return": 0, 35 | "consistent-this": [2, "that", "self"], 36 | "curly": 2, 37 | "default-case": 2, 38 | "dot-location": [2, "property"], 39 | "dot-notation": [2, {"allowKeywords": true}], 40 | "eol-last": 2, 41 | "eqeqeq": 2, 42 | "func-names": 0, 43 | "func-style": 0, 44 | "generator-star-spacing": 2, 45 | "global-require": 0, 46 | "guard-for-in": 2, 47 | "handle-callback-err": 2, 48 | "id-blacklist": 2, 49 | "id-length": 0, 50 | "id-match": 0, 51 | "indent": 2, 52 | "init-declarations": 0, 53 | "key-spacing": 0, 54 | "keyword-spacing": 0, 55 | "linebreak-style": [2, "unix"], 56 | "lines-around-comment": 0, 57 | "max-len": 0, 58 | "new-cap": 0, 59 | "new-parens": 2, 60 | "newline-after-var": 0, 61 | "newline-per-chained-call": 0, 62 | "no-alert": 0, 63 | "no-array-constructor": 2, 64 | "no-bitwise": 2, 65 | "no-caller": 2, 66 | "no-catch-shadow": 2, 67 | "no-confusing-arrow": 2, 68 | "no-console": 0, 69 | "no-continue": 0, 70 | "no-div-regex": 2, 71 | "no-regex-spaces": 0, 72 | "no-else-return": 2, 73 | "no-empty-function": 2, 74 | "no-eq-null": 2, 75 | "no-eval": 2, 76 | "no-extend-native": 2, 77 | "no-extra-bind": 2, 78 | "no-extra-label": 2, 79 | "no-extra-parens": 0, 80 | "no-floating-decimal": 2, 81 | "no-implicit-coercion": 2, 82 | "no-implicit-globals": 2, 83 | "no-implied-eval": 2, 84 | "no-inline-comments": 0, 85 | "no-invalid-this": 0, 86 | "no-iterator": 2, 87 | "no-label-var": 2, 88 | "no-labels": 2, 89 | "no-lone-blocks": 2, 90 | "no-lonely-if": 2, 91 | "no-loop-func": 2, 92 | "no-magic-numbers": 0, 93 | "no-mixed-requires": 0, 94 | "no-multi-spaces": 0, 95 | "no-multi-str": 2, 96 | "no-multiple-empty-lines": 2, 97 | "no-native-reassign": 2, 98 | "no-negated-condition": 0, 99 | "no-nested-ternary": 2, 100 | "no-new": 2, 101 | "no-new-func": 2, 102 | "no-new-object": 2, 103 | "no-new-require": 2, 104 | "no-new-wrappers": 2, 105 | "no-octal-escape": 2, 106 | "no-param-reassign": [0, {"props": false}], 107 | "no-path-concat": 0, 108 | "no-plusplus": 0, 109 | "no-process-env": 0, 110 | "no-process-exit": 0, 111 | "no-proto": 2, 112 | "no-restricted-imports": 2, 113 | "no-restricted-modules": 2, 114 | "no-restricted-syntax": 2, 115 | "no-return-assign": 2, 116 | "no-script-url": 2, 117 | "no-self-compare": 2, 118 | "no-sequences": 2, 119 | "no-shadow": 2, 120 | "no-shadow-restricted-names": 2, 121 | "no-spaced-func": 2, 122 | "no-sync": 0, 123 | "no-ternary": 0, 124 | "no-throw-literal": 2, 125 | "no-trailing-spaces": 2, 126 | "no-undef-init": 2, 127 | "no-undefined": 2, 128 | "no-underscore-dangle": 0, 129 | "no-unmodified-loop-condition": 2, 130 | "no-unneeded-ternary": 2, 131 | "no-unused-expressions": 2, 132 | "no-unused-vars": [2, {"args": "none"}], 133 | "no-use-before-define": [2, {"classes": false, "functions": false}], 134 | "no-useless-call": 2, 135 | "no-useless-concat": 2, 136 | "no-useless-constructor": 2, 137 | "no-var": 0, 138 | "no-void": 2, 139 | "no-warning-comments": 0, 140 | "no-whitespace-before-property": 2, 141 | "no-with": 2, 142 | "object-curly-spacing": [2, "never", { 143 | "objectsInObjects": false, 144 | "arraysInObjects": false 145 | }], 146 | "object-shorthand": 2, 147 | "one-var": 0, 148 | "one-var-declaration-per-line": 0, 149 | "operator-assignment": 2, 150 | "operator-linebreak": 2, 151 | "padded-blocks": [2, "never"], 152 | "prefer-arrow-callback": 0, 153 | "prefer-const": 2, 154 | "prefer-reflect": 0, 155 | "prefer-rest-params": 2, 156 | "prefer-spread": 2, 157 | "prefer-template": 0, 158 | "quote-props": 0, 159 | "quotes": 0, 160 | "radix": 2, 161 | "require-yield": 2, 162 | "semi": 2, 163 | "semi-spacing": 2, 164 | "sort-imports": 2, 165 | "sort-vars": 0, 166 | "space-before-blocks": 0, 167 | "space-before-function-paren": 0, 168 | "space-in-parens": [2, "never"], 169 | "space-infix-ops": 0, 170 | "space-unary-ops": 2, 171 | "spaced-comment": 0, 172 | "strict": 2, 173 | "template-curly-spacing": 2, 174 | "valid-jsdoc": 2, 175 | "vars-on-top": 0, 176 | "wrap-iife": 2, 177 | "wrap-regex": 2, 178 | "yield-star-spacing": 2, 179 | "yoda": [2, "never"] 180 | } 181 | }; 182 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | settings.js 2 | node_modules 3 | npm-debug.log 4 | public/media/js/shorten_concat.js 5 | public/media/shorten.min.js 6 | public/media/css/style.css 7 | public/media/shorten.min.css -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | grunt.loadNpmTasks('grunt-contrib-concat'); 3 | grunt.loadNpmTasks('grunt-contrib-uglify'); 4 | grunt.loadNpmTasks('grunt-contrib-less'); 5 | grunt.loadNpmTasks('grunt-git-describe'); 6 | var localpackage = grunt.file.readJSON('package.json'); 7 | grunt.initConfig({ 8 | gitRevisionSHA: 'master', 9 | gitRevisionDirty: 'clean', 10 | localpackage: grunt.file.readJSON('package.json'), 11 | concat: { 12 | options: { 13 | separator: '\n' 14 | }, 15 | allJavascripts: { 16 | src: [ 17 | 'node_modules/clipboard/dist/clipboard.js', 18 | 'public/media/js/jquery-1.11.1.js', 19 | 'public/media/js/ender.overlay.js', 20 | 'public/media/js/shorten.js' 21 | ], 22 | dest: 'public/media/js/shorten_concat.js' 23 | } 24 | }, 25 | uglify: { 26 | options: { 27 | banner: "/**\n"+ 28 | "<%= localpackage.name %> - <%= gitRevisionSHA %><%= gitRevisionDirty %>\n" + 29 | "<%= localpackage.description %>\n" + 30 | "JavaScript minified on <%= grunt.template.today('dddd, mmmm dS, yyyy, h:MM:ss TT') %>\n" + 31 | "**/\n", 32 | //sourceMap: 'dist/js/scripts.map', // make sure these don't hit live 33 | //sourceMapName: 'dist/js/scripts.map' 34 | }, 35 | dist: { 36 | files: { 37 | 'public/media/shorten.min.js': ['<%= concat.allJavascripts.dest %>'] 38 | } 39 | } 40 | }, 41 | less: { 42 | development: { 43 | options: { 44 | paths: [""] 45 | }, 46 | files: { 47 | "public/media/css/style.css": [ "public/media/css/style.less" ] 48 | } 49 | }, 50 | production: { 51 | options: { 52 | paths: [""], 53 | rootpath: "css/", 54 | cleancss: true, 55 | }, 56 | files: { 57 | "public/media/shorten.min.css": [ "public/media/css/style.less" ] 58 | } 59 | } 60 | }, 61 | "git-describe": { 62 | build: { 63 | options: { 64 | prop: "gitInfo" 65 | } 66 | } 67 | } 68 | 69 | }); 70 | 71 | grunt.registerTask('getGitRevision', function() { 72 | grunt.event.once('git-describe', function (rev) { 73 | grunt.config('gitRevisionSHA', rev.object); 74 | grunt.config('gitRevisionTag', rev.tag); 75 | grunt.config('gitRevisionDirty', rev.dirty); 76 | }); 77 | grunt.task.run('git-describe'); 78 | }); 79 | grunt.registerTask('default', ['getGitRevision', 'concat', 'uglify', 'less']); 80 | grunt.registerTask('live', ['concat', 'uglify', 'less']); 81 | }; 82 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node app.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | __.. , . 2 | (__ |_ _ ._.-+- _ ._ ___ ._ _ _| _ 3 | .__)[ )(_)[ | (/,[ ) [ )(_)(_](/, 4 | 5 | Shorten-node - A URL Shortener web app written in Node.js, with a MongoDB backend. 6 | 7 | This URL shortener app has been running for over 6 years. A testament to how far Node.js has come. 8 | 9 | When I started this project I didn't know much about MongoDB, however over the course of a few years it's easy to see how I would have done things differently (eg: probably used PostgresQL instead 😏). However, it's not broken yet so I'm not going to rewrite things -- it works well on the scale I use it. 10 | 11 | What makes JavaScript development so awesome these days is the massive amount of awesome free things out there. This web app wouldn't be possible without making use of SO MUCH awesome stuff like: 12 | 13 | * ExpressJS (http://expressjs.com/) 14 | * mongoose (https://github.com/LearnBoost/mongoose) 15 | * LessCSS (http://lesscss.org/) 16 | - Less Elements (http://lesselements.com/) 17 | - Semantic.gs (http://semantic.gs/) 18 | * Nunjucks templates (https://mozilla.github.io/nunjucks/) 19 | * nodeunit (https://github.com/caolan/nodeunit) 20 | * Clipboard.js (https://clipboardjs.com/) 21 | * And Heroku for hosting of course! 22 | 23 | Probably also others I'm forgetting. The glue that holds this all together is what I wrote and it's licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php). 24 | 25 | The front-end uses the django inspired templates package called [nunjucks](https://mozilla.github.io/nunjucks/). An asset manager build script is also included. It uses grunt (http://gruntjs.com/). If you plan to make front-end changes make sure to review the documentation there and run the Gruntfile as needed. There are some tests, but it is far from 100% test coverage (more like 20% coverage). Tests are written using nodeunit. 26 | 27 | A note on [web scale](http://mongodb-is-web-scale.com/): The way this is configured to work with MongoDB is that all logs for a given shortened URL live in the same single MongoDB document. For this simple project it's fine. However, if for some reason this project were to be deployed on a very large scale, things would break down quite quickly. Mainly: the size of a single shortened URL document from MongoDB could aquire enough log entries to exceed [MongoDB document limit size](http://www.mongodb.org/display/DOCS/Documents#Documents-MaximumDocumentSize) - and things would be very slow as it approched this limit. While I don't have benchmarks, I'm sure for a dozen or so users using normal volumed twitter accounts, it's more than adequate (at least a few thousand uses/logs per hash before you even need to start to thinking about this). 28 | 29 | ## To setup for local development 30 | 31 | Edit settings.js to match your development and live configurations. You'll need a valid MongoDB URI and a domain for each. 32 | 33 | Install dependencies 34 | 35 | npm install 36 | 37 | Copy and setup local settings: 38 | 39 | cp settings.default.js settings.js 40 | # Setup your domain and mongodb server URI 41 | vim settings.js 42 | 43 | Launch a dev server 44 | 45 | npm start 46 | 47 | The shortener will be available at http://localhost:8888/ 48 | 49 | You can run the tests simply with: 50 | 51 | npm test 52 | 53 | ### To test live server mode (compile + minify CSS/JS) 54 | 55 | 56 | Rebuild assets and launch a live server: 57 | 58 | npm run start.live 59 | 60 | ## To deploy to live using Heroku: 61 | 62 | Make sure you're in the shortening apps git repo directory, or clone it from somewhere else 63 | 64 | git clone git@github.com:KishCom/shorten-node.git 65 | 66 | Login/signup at heroku 67 | 68 | heroku login 69 | 70 | Create a new app, sub in your prefered app name in place of 'supertestshorten' (from here on). 71 | 72 | heroku apps:create supertestshorten -b heroku/nodejs 73 | 74 | Create a sandbox MLab MongoDB (you'll need to have a 'verified' Heroku account for this) 75 | 76 | heroku addons:create mongolab:sandbox --app supertestshorten 77 | 78 | Setup Heroku to be our live app environment 79 | 80 | heroku config:add NODE_ENV=live --app supertestshorten 81 | 82 | Make sure the all the 'live' portions of settings.js is correctly filled out: 83 | 84 | cp settings.default.js settings.js 85 | # Edit settings.js with your settings, proabably just the domain will do 86 | 87 | Make sure assets are compile properly 88 | 89 | grunt 90 | 91 | If you use MongoLab addon ([free teir available](https://addons.heroku.com/mongolab#sandbox)), leave the `live_mongodb_uri` in `settings.js` as an empty string -- it will be picked up by shorten-node automatically. Using other services you can get the proper URI info by listing the config (replace 'supertestshorten' with your app name) -- you will need to populate `live_mongodb_uri` in `settings.js` manually. 92 | Once you've got your mongodb and domain settings changed, add it to your repo and commit the changes. 93 | 94 | # Be careful not to publish settings.js publically! Don't push this branch to your public github or bitbucket! 95 | git add settings.js 96 | git commit -am "Added my settings" 97 | 98 | You should see: "NODE_ENV => live" part of the output of this command (replacing 'supertestshorten' with the name of your app): 99 | 100 | heroku config --app supertestshorten 101 | 102 | You're probably not going to want to use their placeholder domain. Replace kish.cm with the domain of your shortener (and [set your domain up to point to this app properly](https://devcenter.heroku.com/articles/custom-domains)) 103 | 104 | # Skip this step if you don't want to use the default heroku domain: supertestshorten.herokuapp.com 105 | heroku domains:add yourawesomedomain.com 106 | 107 | Finally, push the repo to heroku, if everything is working your app is now deployed and live! 108 | 109 | git push heroku master 110 | 111 | ## To update your app running on heroku 112 | 113 | Get a copy of the current running app (replace 'supertestshorten' with your app name) 114 | 115 | git clone git@heroku.com:supertestshorten.git -o heroku 116 | 117 | Make edits to the app as you need (replace 'supertestshorten' with your app name) 118 | cd supertestshorten 119 | 120 | #edit some stuff 121 | 122 | Commit your changes and add a message 123 | 124 | git commit -a -m "Updated widgets to be more widgety" 125 | 126 | Push changes to live server 127 | 128 | git push heroku master 129 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * shorten-node - A URL Shortening web app 3 | * Andrew Kish, 2014 - 2020 4 | */ 5 | 6 | var express = require('express'), 7 | nunjucks = require("nunjucks"), 8 | Routes = require('./routes'), 9 | mongoose = require('mongoose'), 10 | extras = require('express-extras'), 11 | cookieParser = require("cookie-parser"), 12 | bodyParser = require("body-parser"), 13 | expressSession = require("express-session"), 14 | settings = require('./settings').shorten_settings, 15 | lessMiddleware = require("less-middleware"), 16 | models = require('./settings').models, 17 | bunyan = require("bunyan"), log, 18 | site = module.exports = express(); 19 | 20 | var packagejson = require('./package'); 21 | if (process.env.NODE_ENV === "dev" || process.env.NODE_ENV === "live" || process.env.NODE_ENV === "test"){ 22 | settings.NODE_ENV = process.env.NODE_ENV; 23 | settings.appName = packagejson.name; 24 | settings.appVersion = packagejson.version; 25 | site.locals.settings = settings; 26 | }else{ 27 | console.fatal("Missing NODE_ENV environment variable. Must be set to 'dev', 'test', or 'live'."); 28 | process.exit(-1); 29 | } 30 | 31 | //LESS compiler middleware, if style.css is requested it will automatically compile and return style.less 32 | site.use(lessMiddleware(__dirname + "/public")); 33 | 34 | nunjucks.configure('views', { 35 | autoescape: true, 36 | express: site 37 | }); 38 | site.set("view engine", "html"); 39 | site.set("views", __dirname + "/views"); 40 | 41 | //The rest of our static-served files 42 | site.use(express.static(__dirname + '/public')); 43 | 44 | //Middlewares 45 | site.use(extras.fixIP()); //Normalize various IP address sources to be more accurate 46 | if (settings.NODE_ENV !== "test"){ 47 | site.use(extras.throttle({ //Simple throttle to prevent API abuse 48 | urlCount: 5, 49 | urlSec: 1, 50 | holdTime: 5, 51 | whitelist: { 52 | '127.0.0.1': true, 53 | 'localhost': true, 54 | '192.168.2.99': true // You'll want to whitelist any testing servers 55 | } 56 | })); 57 | } 58 | 59 | site.use(bodyParser.urlencoded({extended: true})); 60 | site.use(bodyParser.json()); 61 | site.use(cookieParser()); 62 | site.use(expressSession({ 63 | secret: settings.sessionSecret, 64 | key: packagejson.name + ".sid", 65 | saveUninitialized: false, 66 | resave: false, 67 | cookie: { 68 | maxAge: 2592000 * 1000, // 30 days in ms 69 | path: '/', 70 | secure: (settings.NODE_ENV === "live"), 71 | domain: settings.NODE_ENV === "live" ? settings.live_domain : settings.dev_domain 72 | } 73 | })); 74 | 75 | // Configure logging 76 | log = bunyan.createLogger({name: "shorten-node", 77 | streams: [{ 78 | level: "trace", // Priority of levels looks like this: Trace -> Debug -> Info -> Warn -> Error -> Fatal 79 | stream: process.stdout, // Developers will want to see this piped to their consoles 80 | }]}); 81 | site.set('bunyan', log); 82 | 83 | /* 84 | ** Sever specific configuration 85 | */ 86 | //Dev mode 87 | if (settings.NODE_ENV === "dev"){ 88 | //Set your domain name for your development environment 89 | site.set('domain', settings.dev_domain); 90 | log.debug("Running in dev mode"); 91 | mongoose.connect(settings.dev_mongodb_uri, {useNewUrlParser: true, useUnifiedTopology: true}); 92 | }else if (settings.NODE_ENV === "test"){ 93 | //Set your domain name for your development environment 94 | site.set('domain', settings.dev_domain); 95 | log.debug("Running in test mode"); 96 | mongoose.connect(settings.test_mongodb_uri, {useNewUrlParser: true, useUnifiedTopology: true}); 97 | }else if (settings.NODE_ENV === "live"){ 98 | //Set your domain name for the shortener here 99 | site.set('domain', settings.live_domain); 100 | mongoose.connect(settings.live_mongodb_uri === '' ? process.env.MONGODB_URI : settings.live_mongodb_uri, {useNewUrlParser: true, useUnifiedTopology: true}); 101 | }else{ 102 | log.fatal("NODE_ENV not set, or not set properly."); 103 | process.end(-1); 104 | } 105 | mongoose.model('LinkMaps', models.LinkMaps, 'linkmaps'); //models is pulled in from settings.json 106 | site.set('mongoose', mongoose); 107 | 108 | /* 109 | ** Routes/Views 110 | */ 111 | //We pass Routes our entire app so it has access to the app context 112 | var routes = new Routes(site); 113 | 114 | // Here are all our routes 115 | site.get('/', routes.index); 116 | site.get('/developers/', routes.developers); 117 | site.post('/rpc/setLink', routes.setLink); 118 | site.post('/rpc/getLink', routes.getLink); 119 | site.get(/^\/([a-zA-Z0-9]{6,32})$/, routes.navLink); 120 | //Catch all other attempted routes and throw them a 404! 121 | site.all('*', function(req, resp, next){ 122 | next({name: "NotFound", "message": "Oops! The page you requested doesn't exist", "status": 404}); 123 | }); 124 | // Use our custom error handler 125 | site.use(routes.errorHandler); 126 | 127 | /* 128 | ** Server startup 129 | */ 130 | // Use port 8888 or a provided PORT environment variable 131 | var port = process.env.PORT || 8888; 132 | site.listen(port, () => log.info("URL Shortener listening to http://" + site.set('domain') + " in %s mode", site.settings.env)); 133 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shorten-node", 3 | "author": "Andrew Kish ", 4 | "private": true, 5 | "scripts": { 6 | "start": "grunt; cross-env NODE_ENV=dev nodemon app.js | bunyan", 7 | "start.live": "grunt; cross-env NODE_ENV=live node app.js | bunyan", 8 | "test": "grunt; cross-env NODE_ENV=test mocha tests.js -b -s 200 -t 10000 --exit | bunyan", 9 | "postinstall": "grunt live" 10 | }, 11 | "engines": { 12 | "node": "10.x.x" 13 | }, 14 | "version": "1.13.2", 15 | "dependencies": { 16 | "accepts": "1.3.x", 17 | "body-parser": "1.19.x", 18 | "clipboard": "^2.0.6", 19 | "cookie-parser": "1.4.x", 20 | "escape-html": "1.0.x", 21 | "express": "4.17.x", 22 | "express-extras": "0.3.x", 23 | "express-session": "1.17.x", 24 | "less": "3.11.x", 25 | "less-middleware": "3.1.x", 26 | "mongoose": "5.11.x", 27 | "multer": "1.4.x", 28 | "nunjucks": "^3.2.1", 29 | "sanitize-caja": "0.1.x", 30 | "validator": "13.0.x" 31 | }, 32 | "devDependencies": { 33 | "async": "latest", 34 | "bunyan": "^1.8.x", 35 | "chai": "^4.2.0", 36 | "cross-env": "^7.0.2", 37 | "eslint": "^7.x.x", 38 | "eslint-plugin-html": "^6.x.x", 39 | "grunt": "~1.1.x", 40 | "grunt-cli": "^1.3.2", 41 | "grunt-contrib-concat": "~1.0.x", 42 | "grunt-contrib-less": "~2.0.x", 43 | "grunt-contrib-uglify": "~4.0.x", 44 | "grunt-contrib-watch": "~1.1.x", 45 | "grunt-git-describe": "~2.4.x", 46 | "mocha": "^10.2.0", 47 | "nodemon": "^2.0.4", 48 | "request": "latest", 49 | "supertest": "^4.0.2" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KishCom/shorten-node/c627d4734c6b59319971eed6a6111178bbde48c7/public/favicon.ico -------------------------------------------------------------------------------- /public/media/css/fonts.css: -------------------------------------------------------------------------------- 1 | @media screen { 2 | @font-face { 3 | font-family: 'PT Sans'; 4 | font-style: normal; 5 | font-weight: bold; 6 | src: local('PT Sans Bold'), local('PTSans-Bold'), url('http://themes.googleusercontent.com/static/fonts/ptsans/v3/0XxGQsSc1g4rdRdjJKZrNBsxEYwM7FgeyaSgU71cLG0.woff') format('woff'); 7 | } 8 | } 9 | @media screen { 10 | @font-face { 11 | font-family: 'PT Sans'; 12 | font-style: normal; 13 | font-weight: normal; 14 | src: local('PT Sans'), local('PTSans-Regular'), url('http://themes.googleusercontent.com/static/fonts/ptsans/v3/LKf8nhXsWg5ybwEGXk8UBQ.woff') format('woff'); 15 | } 16 | } -------------------------------------------------------------------------------- /public/media/css/mixins.less: -------------------------------------------------------------------------------- 1 | .gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { 2 | background: @color; 3 | background: -webkit-gradient(linear, 4 | left bottom, 5 | left top, 6 | color-stop(0, @start), 7 | color-stop(1, @stop)); 8 | background: -ms-linear-gradient(bottom, 9 | @start, 10 | @stop); 11 | background: -moz-linear-gradient(center bottom, 12 | @start 0%, 13 | @stop 100%); 14 | } 15 | .bw-gradient(@color: #F5F5F5, @start: 0, @stop: 255) { 16 | background: @color; 17 | background: -webkit-gradient(linear, 18 | left bottom, 19 | left top, 20 | color-stop(0, rgb(@start,@start,@start)), 21 | color-stop(1, rgb(@stop,@stop,@stop))); 22 | background: -ms-linear-gradient(bottom, 23 | rgb(@start,@start,@start) 0%, 24 | rgb(@start,@start,@start) 100%); 25 | background: -moz-linear-gradient(center bottom, 26 | rgb(@start,@start,@start) 0%, 27 | rgb(@stop,@stop,@stop) 100%); 28 | } 29 | .bordered(@top-color: #EEE, @right-color: #EEE, @bottom-color: #EEE, @left-color: #EEE) { 30 | border-top: solid 1px @top-color; 31 | border-left: solid 1px @left-color; 32 | border-right: solid 1px @right-color; 33 | border-bottom: solid 1px @bottom-color; 34 | } 35 | .drop-shadow(@x-axis: 0, @y-axis: 1px, @blur: 2px, @alpha: 0.1) { 36 | -webkit-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 37 | -moz-box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 38 | box-shadow: @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); 39 | } 40 | .rounded(@radius: 2px) { 41 | -webkit-border-radius: @radius; 42 | -moz-border-radius: @radius; 43 | border-radius: @radius; 44 | -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 45 | } 46 | .border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) { 47 | -webkit-border-top-right-radius: @topright; 48 | -webkit-border-bottom-right-radius: @bottomright; 49 | -webkit-border-bottom-left-radius: @bottomleft; 50 | -webkit-border-top-left-radius: @topleft; 51 | -moz-border-radius-topright: @topright; 52 | -moz-border-radius-bottomright: @bottomright; 53 | -moz-border-radius-bottomleft: @bottomleft; 54 | -moz-border-radius-topleft: @topleft; 55 | border-top-right-radius: @topright; 56 | border-bottom-right-radius: @bottomright; 57 | border-bottom-left-radius: @bottomleft; 58 | border-top-left-radius: @topleft; 59 | -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; 60 | } 61 | .opacity(@opacity: 0.5) { 62 | -moz-opacity: @opacity; 63 | -khtml-opacity: @opacity; 64 | -webkit-opacity: @opacity; 65 | opacity: @opacity; 66 | } 67 | .transition-duration(@duration: 0.2s) { 68 | -moz-transition-duration: @duration; 69 | -webkit-transition-duration: @duration; 70 | transition-duration: @duration; 71 | } 72 | .rotation(@deg:5deg){ 73 | -webkit-transform: rotate(@deg); 74 | -moz-transform: rotate(@deg); 75 | transform: rotate(@deg); 76 | } 77 | .scale(@ratio:1.5){ 78 | -webkit-transform:scale(@ratio); 79 | -moz-transform:scale(@ratio); 80 | transform:scale(@ratio); 81 | } 82 | .transition(@duration:0.2s, @ease:ease-out) { 83 | -webkit-transition: all @duration @ease; 84 | -moz-transition: all @duration @ease; 85 | transition: all @duration @ease; 86 | } 87 | .inner-shadow(@horizontal:0, @vertical:1px, @blur:2px, @alpha: 0.4) { 88 | -webkit-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 89 | -moz-box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 90 | box-shadow: inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha); 91 | } 92 | .box-shadow(@arguments) { 93 | -webkit-box-shadow: @arguments; 94 | -moz-box-shadow: @arguments; 95 | box-shadow: @arguments; 96 | } 97 | .columns(@colwidth: 250px, @colcount: 0, @colgap: 50px, @columnRuleColor: #EEE, @columnRuleStyle: solid, @columnRuleWidth: 1px) { 98 | -moz-column-width: @colwidth; 99 | -moz-column-count: @colcount; 100 | -moz-column-gap: @colgap; 101 | -moz-column-rule-color: @columnRuleColor; 102 | -moz-column-rule-style: @columnRuleStyle; 103 | -moz-column-rule-width: @columnRuleWidth; 104 | -webkit-column-width: @colwidth; 105 | -webkit-column-count: @colcount; 106 | -webkit-column-gap: @colgap; 107 | -webkit-column-rule-color: @columnRuleColor; 108 | -webkit-column-rule-style: @columnRuleStyle; 109 | -webkit-column-rule-width: @columnRuleWidth; 110 | column-width: @colwidth; 111 | column-count: @colcount; 112 | column-gap: @colgap; 113 | column-rule-color: @columnRuleColor; 114 | column-rule-style: @columnRuleStyle; 115 | column-rule-width: @columnRuleWidth; 116 | } 117 | .translate(@x:0, @y:0) { 118 | -moz-transform: translate(@x, @y); 119 | -webkit-transform: translate(@x, @y); 120 | -o-transform: translate(@x, @y); 121 | -ms-transform: translate(@x, @y); 122 | transform: translate(@x, @y); 123 | } 124 | 125 | -------------------------------------------------------------------------------- /public/media/css/reset.css: -------------------------------------------------------------------------------- 1 | /* Thanks: HTML5 ✰ Boilerplate */ 2 | 3 | html, body, div, span, object, iframe, 4 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 5 | abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, 6 | small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, 7 | fieldset, form, label, legend, 8 | table, caption, tbody, tfoot, thead, tr, th, td, 9 | article, aside, canvas, details, figcaption, figure, 10 | footer, header, hgroup, menu, nav, section, summary, 11 | time, mark, audio, video { 12 | margin: 0; 13 | padding: 0; 14 | border: 0; 15 | font-size: 100%; 16 | font: inherit; 17 | vertical-align: baseline; 18 | } 19 | 20 | article, aside, details, figcaption, figure, 21 | footer, header, hgroup, menu, nav, section { 22 | display: block; 23 | } 24 | 25 | blockquote, q { quotes: none; } 26 | blockquote:before, blockquote:after, 27 | q:before, q:after { content: ""; content: none; } 28 | ins { background-color: #222AF3; color: #000; text-decoration: none; } 29 | mark { background-color: #222AF3; color: #000; font-style: italic; font-weight: bold; } 30 | del { text-decoration: line-through; } 31 | abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; } 32 | table { border-collapse: collapse; border-spacing: 0; } 33 | hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; } 34 | input, select { vertical-align: middle; } 35 | 36 | body { font:13px/1.231 sans-serif; *font-size:small; } 37 | select, input, textarea, button { font:99% sans-serif; } 38 | pre, code, kbd, samp { font-family: monospace, sans-serif; } 39 | 40 | html { overflow-y: scroll; } 41 | a:hover, a:active { outline: none; } 42 | ul, ol { margin-left: 2em; } 43 | ol { list-style-type: decimal; } 44 | nav ul, nav li { margin: 0; list-style:none; list-style-image: none; } 45 | small { font-size: 85%; } 46 | strong, th { font-weight: bold; } 47 | td { vertical-align: top; } 48 | sub, sup { font-size: 75%; line-height: 0; position: relative; } 49 | sup { top: -0.5em; } 50 | sub { bottom: -0.25em; } 51 | 52 | pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 15px; } 53 | textarea { overflow: auto; } 54 | .ie6 legend, .ie7 legend { margin-left: -7px; } 55 | input[type="radio"] { vertical-align: text-bottom; } 56 | input[type="checkbox"] { vertical-align: bottom; } 57 | .ie7 input[type="checkbox"] { vertical-align: baseline; } 58 | .ie6 input { vertical-align: text-bottom; } 59 | label, input[type="button"], input[type="submit"], input[type="image"], button { cursor: pointer; } 60 | button, input, select, textarea { margin: 0; } 61 | input:valid, textarea:valid { } 62 | input:invalid, textarea:invalid { border-radius: 1px; -moz-box-shadow: 0px 0px 5px red; -webkit-box-shadow: 0px 0px 5px red; box-shadow: 0px 0px 5px red; } 63 | .no-boxshadow input:invalid, .no-boxshadow textarea:invalid { background-color: #333; } 64 | 65 | 66 | ::-moz-selection{ background: #333; color:#fff; text-shadow: none; } 67 | ::selection { background:#333; color:#fff; text-shadow: none; } 68 | a:link { -webkit-tap-highlight-color: #222AF3; } 69 | button { width: auto; overflow: visible; } 70 | .ie7 img { -ms-interpolation-mode: bicubic; } 71 | 72 | body, select, input, textarea { color: #444; } 73 | h1, h2, h3, h4, h5, h6 { font-weight: bold; } 74 | a, a:active, a:visited { color: #222AF3; } 75 | a:hover { color: #036; } -------------------------------------------------------------------------------- /public/media/css/semantic.gs.less: -------------------------------------------------------------------------------- 1 | ///////////////// 2 | // Semantic.gs // for LESS: http://lesscss.org/ 3 | ///////////////// 4 | 5 | // Defaults which you can freely override 6 | @column-width: 60; 7 | @gutter-width: 20; 8 | @columns: 12; 9 | 10 | // Utility variable — you should never need to modify this 11 | @gridsystem-width: (@column-width*@columns) + (@gutter-width*@columns) * 1px; 12 | 13 | // Set @total-width to 100% for a fluid layout 14 | @total-width: @gridsystem-width; 15 | 16 | // Uncomment these two lines and the star-hack width/margin lines below to enable sub-pixel fix for IE6 & 7. See http://tylertate.com/blog/2012/01/05/subpixel-rounding.html 17 | // @min-width: 960; 18 | // @correction: 0.5 / @min-width * 100 * 1%; 19 | 20 | // The micro clearfix http://nicolasgallagher.com/micro-clearfix-hack/ 21 | .clearfix() { 22 | *zoom:1; 23 | 24 | &:before, 25 | &:after { 26 | content:""; 27 | display:table; 28 | } 29 | &:after { 30 | clear:both; 31 | } 32 | } 33 | 34 | 35 | ////////// 36 | // GRID // 37 | ////////// 38 | 39 | body { 40 | width: 100%; 41 | .clearfix; 42 | } 43 | 44 | .row(@columns:@columns) { 45 | display: block; 46 | width: @total-width*((@gutter-width + @gridsystem-width)/@gridsystem-width); 47 | margin: 0 @total-width*(((@gutter-width*.5)/@gridsystem-width)*-1); 48 | // *width: @total-width*((@gutter-width + @gridsystem-width)/@gridsystem-width)-@correction; 49 | // *margin: 0 @total-width*(((@gutter-width*.5)/@gridsystem-width)*-1)-@correction; 50 | .clearfix; 51 | } 52 | .column(@x,@columns:@columns) { 53 | width: @total-width*((((@gutter-width+@column-width)*@x)-@gutter-width) / @gridsystem-width); 54 | margin: 0 @total-width*((@gutter-width*.5)/@gridsystem-width); 55 | // *width: @total-width*((((@gutter-width+@column-width)*@x)-@gutter-width) / @gridsystem-width)-@correction; 56 | // *margin: 0 @total-width*((@gutter-width*.5)/@gridsystem-width)-@correction; 57 | } 58 | .push(@offset:1) { 59 | margin-left: @total-width*(((@gutter-width+@column-width)*@offset) / @gridsystem-width) + @total-width*((@gutter-width*.5)/@gridsystem-width); 60 | } 61 | .pull(@offset:1) { 62 | margin-right: @total-width*(((@gutter-width+@column-width)*@offset) / @gridsystem-width) + @total-width*((@gutter-width*.5)/@gridsystem-width); 63 | } 64 | -------------------------------------------------------------------------------- /public/media/css/style.less: -------------------------------------------------------------------------------- 1 | @import "reset.css"; 2 | @import "mixins.less"; 3 | @import "semantic.gs.less"; 4 | @import "fonts.css"; 5 | 6 | // Specify the number of columns and set column and gutter widths 7 | @columns: 12; 8 | @column-width: 60; 9 | @gutter-width: 20; 10 | 11 | // Remove the definition below for a pixel-based layout 12 | @total-width: 100%; 13 | 14 | body, html{ 15 | font-family: 'PTSans-Regular', sans-serif; 16 | font-size: 11px; 17 | color: #444; 18 | .bw-gradient(#EEE, 230, 255); 19 | height: 100%; 20 | margin: 0; 21 | background-repeat: no-repeat; 22 | background-attachment: fixed; 23 | } 24 | h1{ 25 | font-family: 'PTSans-Bold', sans-serif; 26 | font-weight: bolder; 27 | margin: 50px 0 50px 0; 28 | font-size: 50px; 29 | } 30 | a,a:hover,a:visited,a:active{ 31 | color: #444; 32 | } 33 | 34 | #header, #content, #footer{ 35 | .column(10); 36 | margin: 0 auto; 37 | clear: both; 38 | max-width: 850px; 39 | overflow: hidden; 40 | } 41 | #instructions, #response{ 42 | font-family:'PTSans-Regular',sans-serif; 43 | font-size: 1em; 44 | padding-top: 0.5em; 45 | float: left; 46 | clear: left; 47 | width: 45%; 48 | margin: 0; 49 | } 50 | #content{ 51 | min-height: 175px; 52 | } 53 | #response { 54 | float:right; 55 | text-align:right; 56 | display: none; 57 | } 58 | #footer{ 59 | margin-top: 10em; 60 | text-align: center; 61 | } 62 | #Modal{ 63 | display: none; 64 | top: 50px; 65 | width: 60em; 66 | min-height: 300px; 67 | border: solid 1px #444; 68 | .rounded(15px); 69 | .drop-shadow(0, 3px, 5px, 0.2); 70 | .bw-gradient(#EEE, 255, 230); 71 | text-align: center; 72 | padding: 20px; 73 | } 74 | .close{ 75 | position: absolute; 76 | right: 4px; 77 | top: 4px; 78 | width: 25px; 79 | height: 20px; 80 | background: #000; 81 | color: #FFF; 82 | display: inline-block; 83 | font-size: 1.5em; 84 | font-weight: bolder; 85 | cursor: pointer; 86 | .rounded(15px); 87 | 88 | } 89 | ::-webkit-input-placeholder { 90 | color: #999; 91 | } 92 | :-moz-placeholder { 93 | color: #999; 94 | } 95 | #originalURL, #shortenedURL{ 96 | font-size: 2em; 97 | font-family: 'PTSans-Regular', sans-serif; 98 | width: 80%; 99 | height: 30px; 100 | border: solid 1px #CCC; 101 | margin: 10px 0 1em 0; 102 | } 103 | button{ 104 | font-size: 1.5em; 105 | font-family: 'PTSans-Regular', sans-serif; 106 | display: block; 107 | width: 18%; 108 | float: right; 109 | height: 33px; 110 | .gradient(#F5F5F5, #EEE, #FFF); 111 | border: solid 1px #CCC; 112 | margin: 10px 0 1em 0; 113 | padding: 0; 114 | } 115 | button:hover{ 116 | cursor: pointer; 117 | .gradient(#F5F5F5, #CCC, #FFF); 118 | } 119 | #liveCopyToClip{ 120 | font-size: 1em; 121 | margin: 5px 0 0 0; 122 | width: 30%; 123 | } 124 | #response input{ /* IE7/8 */ 125 | clear: both; 126 | display: inline-block; 127 | } 128 | #errorMessage, #statsError{ 129 | font-family: 'PTSans-Bold', sans-serif; 130 | font-weight: bolder; 131 | font-size: 1.5em; 132 | color: #FF7878; 133 | float: right; 134 | } 135 | #getLinkResponse{ 136 | display: none; 137 | text-align:left; 138 | } 139 | #getLinkResponse table{ 140 | width: 90% 141 | } 142 | #Statstable{ 143 | clear: both; 144 | } 145 | #StatsTitle, th{ 146 | font-family: 'PTSans-Bold', sans-serif; 147 | font-weight: bolder; 148 | font-size: 1.75em; 149 | float: left; 150 | } 151 | #StatsOriginalURL{ 152 | font-family: 'PTSans-Bold', sans-serif; 153 | font-size: 1.0em; 154 | margin: 5px 0; 155 | clear: both; 156 | float: left; 157 | width: 100%; 158 | } 159 | th{ 160 | font-size: 1.0em; 161 | } 162 | .odd{ 163 | background: #FFF; 164 | } 165 | .tableCount{ 166 | text-align: right; 167 | float: right; 168 | width: 5%; 169 | } 170 | table{ 171 | margin: 15px 0; 172 | } 173 | 174 | blockquote{ 175 | font-family: monospace; 176 | font-size: 1em; 177 | background: #FFF; 178 | border: solid 1px #444; 179 | padding: 10px; 180 | } 181 | p{ 182 | margin: 0 0 15px 0; 183 | } 184 | #timesUsedHolder{ 185 | clear: both; 186 | } 187 | /* TODO 188 | @media screen and (max-width: 720px) { 189 | 190 | } 191 | */ 192 | -------------------------------------------------------------------------------- /public/media/js/ender.overlay.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Ender-Overlay: Highly Customizable Overlay for Ender 3 | * copyright Andras Nemeseri @nemeseri 2012 | License MIT 4 | * https://github.com/nemeseri/ender-overlay 5 | */ 6 | !function ($) { 7 | var is, 8 | transition; 9 | 10 | // from valentine 11 | is = { 12 | fun: function (f) { 13 | return typeof f === 'function'; 14 | }, 15 | arr: function (ar) { 16 | return ar instanceof Array; 17 | }, 18 | obj: function (o) { 19 | return o instanceof Object && !is.fun(o) && !is.arr(o); 20 | } 21 | }; 22 | 23 | /* 24 | Based on Bootstrap 25 | Mozilla and Webkit support only 26 | */ 27 | transition = (function () { 28 | var st = document.createElement('div').style, 29 | transitionEnd = 'TransitionEnd', 30 | transitionProp = 'Transition', 31 | support = st.transition !== undefined || 32 | st.WebkitTransition !== undefined || 33 | st.MozTransition !== undefined; 34 | 35 | return support && { 36 | prop: (function () { 37 | if (st.WebkitTransition !== undefined) { 38 | transitionProp = 'WebkitTransition'; 39 | } else if (st.MozTransition !== undefined) { 40 | transitionProp = 'MozTransition'; 41 | } 42 | return transitionProp; 43 | }()), 44 | end: (function () { 45 | if (st.WebkitTransition !== undefined) { 46 | transitionEnd = 'webkitTransitionEnd'; 47 | } else if (st.MozTransition !== undefined) { 48 | transitionEnd = 'transitionend'; 49 | } 50 | return transitionEnd; 51 | }()) 52 | }; 53 | }()); 54 | 55 | function extend() { 56 | // based on jQuery deep merge 57 | var options, name, src, copy, clone, 58 | target = arguments[0], i = 1, length = arguments.length; 59 | 60 | for (; i < length; i += 1) { 61 | if ((options = arguments[i]) !== null) { 62 | // Extend the base object 63 | for (name in options) { 64 | src = target[name]; 65 | copy = options[name]; 66 | if (target === copy) { 67 | continue; 68 | } 69 | if (copy && (is.obj(copy))) { 70 | clone = src && is.obj(src) ? src : {}; 71 | target[name] = extend(clone, copy); 72 | } else if (copy !== undefined) { 73 | target[name] = copy; 74 | } 75 | } 76 | } 77 | } 78 | return target; 79 | } 80 | 81 | function clone(obj) { 82 | if (null === obj || 'object' !== typeof obj) { 83 | return obj; 84 | } 85 | var copy = obj.constructor(), 86 | attr; 87 | for (attr in obj) { 88 | if (obj.hasOwnProperty(attr)) { 89 | copy[attr] = obj[attr]; 90 | } 91 | } 92 | return copy; 93 | } 94 | 95 | // from jquery 96 | function proxy(fn, context) { 97 | var slice = Array.prototype.slice, 98 | args = slice.call(arguments, 2); 99 | return function () { 100 | return fn.apply(context, args.concat(slice.call(arguments))); 101 | }; 102 | } 103 | 104 | function animate(options) { 105 | var el = options.el, 106 | complete = options.complete ? options.complete : function () {}, 107 | animation, 108 | dummy; 109 | 110 | // no animation obj OR animation is not available, 111 | // fallback to css and call the callback 112 | if (! options.animation || 113 | ! (el.animate || (options.css3transition && transition))) { 114 | el.css(options.fallbackCss); 115 | complete(); 116 | return; 117 | } 118 | 119 | // we will animate, apply start CSS 120 | if (options.animStartCss) { 121 | if (options.animStartCss.opacity === 0) { 122 | options.animStartCss.opacity = 0.01; // ie quirk 123 | } 124 | el.css(options.animStartCss); 125 | } 126 | animation = options.animation; 127 | 128 | // css3 setted, if available apply the css 129 | if (options.css3transition && transition) { 130 | dummy = el[0].offsetWidth; // force reflow; source: bootstrap 131 | el[0].style[transition.prop] = 'all ' + animation.duration + 'ms ease-out'; 132 | 133 | // takaritas 134 | delete animation.duration; 135 | 136 | el.css(animation); 137 | //el.unbind(transition.end); 138 | el.on(transition.end, function () { 139 | // delete transition properties and events 140 | el.off(transition.end); 141 | el[0].style[transition.prop] = 'none'; 142 | complete(); 143 | }); 144 | } else if (window.ender) { 145 | // use morpheus 146 | el.animate(extend(animation, {'complete': complete})); 147 | } else { 148 | // use animate from jquery 149 | el.animate(animation, animation.duration, 'swing', complete); 150 | } 151 | } 152 | 153 | /* 154 | OverlayMask Constructor 155 | */ 156 | function OverlayMask(settings) { 157 | this.init(settings); 158 | } 159 | 160 | OverlayMask.prototype = { 161 | init: function (options) { 162 | this.options = { 163 | id: 'ender-overlay-mask', 164 | zIndex: 9998, 165 | opacity: 0.6, 166 | color: "#777" 167 | }; 168 | 169 | extend(this.options, options || {}); 170 | 171 | var $mask = $('#' + this.options.id), 172 | opt = this.options; 173 | 174 | if (! $mask.length) { 175 | $mask = $('
') 176 | .attr('id', this.options.id) 177 | .css({ 178 | display: 'none', 179 | position: 'absolute', 180 | top: 0, 181 | left: 0 182 | }) 183 | .appendTo('body'); 184 | } 185 | 186 | this.$mask = $mask; 187 | }, 188 | 189 | show: function () { 190 | // apply instance mask options 191 | var opt = this.options, 192 | docSize = this.getDocSize(), 193 | animObj = false; 194 | 195 | this.$mask.css({ 196 | zIndex: opt.zIndex, 197 | backgroundColor: opt.color, 198 | width: docSize.width, 199 | height: docSize.height 200 | }); 201 | 202 | if (opt.durationIn) { 203 | animObj = { 204 | opacity: opt.opacity, 205 | duration: opt.durationIn 206 | }; 207 | } 208 | 209 | animate({ 210 | el: this.$mask, 211 | animStartCss: { 212 | opacity: 0.01, // ie quirk 213 | display: 'block' 214 | }, 215 | animation: animObj, 216 | fallbackCss: {display: 'block', opacity: opt.opacity}, 217 | css3transition: opt.css3transition 218 | }); 219 | 220 | }, 221 | 222 | hide: function () { 223 | var opt = this.options, 224 | self = this, 225 | animObj = false; 226 | 227 | if (opt.durationOut) { 228 | animObj = { 229 | opacity: 0, 230 | duration: opt.durationOut 231 | }; 232 | } 233 | 234 | animate({ 235 | el: this.$mask, 236 | animation: animObj, 237 | complete: function () { 238 | self.$mask.css({display: 'none'}); 239 | }, 240 | fallbackCss: {display: 'none'}, 241 | css3transition: opt.css3transition 242 | }); 243 | }, 244 | 245 | getDocSize: function () { 246 | if (window.ender) { // ender 247 | return { 248 | width: $.doc().width, 249 | height: $.doc().height 250 | }; 251 | } else if (window.Zepto) { 252 | // zepto caches the document height.. 253 | var doc = window.document, 254 | html = doc.documentElement, 255 | ie = /msie/i.test(navigator.userAgent), 256 | vp = { 257 | width: ie ? html.clientWidth : self.innerWidth, 258 | height: ie ? html.clientHeight : self.innerHeight 259 | } 260 | return { 261 | width: Math.max(doc.body.scrollWidth, html.scrollWidth, vp.width), 262 | height: Math.max(doc.body.scrollHeight, html.scrollHeight, vp.height) 263 | }; 264 | } else { // jquery / zepto 265 | return { 266 | width: $(document).width(), 267 | height: $(document).height() 268 | }; 269 | } 270 | }, 271 | 272 | getMask: function () { 273 | return this.$mask; 274 | } 275 | }; 276 | 277 | /* 278 | Overlay Constructor 279 | */ 280 | function Overlay(el, settings) { 281 | this.init(el, settings); 282 | 283 | // only return the API 284 | // instead of this 285 | return this.getApi(); 286 | } 287 | 288 | Overlay.prototype = { 289 | init: function ($el, options) { 290 | this.options = { 291 | top: 80, 292 | position: 'absolute', 293 | cssClass: 'ender-overlay', 294 | close: '.close', 295 | trigger: null, 296 | zIndex: 9999, 297 | showMask: true, 298 | closeOnEsc: true, 299 | closeOnMaskClick: true, 300 | autoOpen: false, 301 | allowMultipleDisplay: false, 302 | 303 | // morpheus required for JS fallback 304 | css3transition: false, // experimental 305 | 306 | // start values before animation 307 | startAnimationCss: { 308 | opacity: 0.01 // ie quirk 309 | }, 310 | 311 | // morpheus animation options 312 | animationIn: { 313 | opacity: 1, 314 | duration: 250 315 | }, 316 | 317 | animationOut: { 318 | opacity: 0, 319 | duration: 250 320 | }, 321 | 322 | mask: {}, 323 | 324 | onBeforeOpen: function () {}, 325 | onBeforeClose: function () {}, 326 | onOpen: function () {}, 327 | onClose: function () {} 328 | }; 329 | 330 | this.setOptions(options); 331 | this.$overlay = $el.css({ 332 | display: 'none' 333 | }); 334 | 335 | if (this.options.showMask) { 336 | this.mask = new OverlayMask(this.options.mask); 337 | } 338 | 339 | // prevent multiple event binding 340 | if (! this.$overlay.attr('data-overlayloaded')) { 341 | this.attachEvents(); 342 | this.$overlay.attr('data-overlayloaded', 1); 343 | } 344 | 345 | if (this.options.autoOpen) { 346 | this.open(); 347 | } 348 | }, 349 | 350 | attachEvents: function () { 351 | var self = this, 352 | opt = this.options; 353 | 354 | // Bind open method to trigger's click event 355 | if (opt.trigger && $(opt.trigger).length) { 356 | $(opt.trigger).on('click', function (e) { 357 | e.preventDefault(); 358 | self.open(); 359 | }); 360 | } 361 | 362 | this.$overlay.on('click', opt.close, function (e) { 363 | e.preventDefault(); 364 | self.close(); 365 | }); 366 | 367 | // attach event listeners 368 | $(document).on('ender-overlay.close', function () { 369 | self.close(); 370 | }); 371 | 372 | $(document).on('ender-overlay.closeOverlay', function () { 373 | self.close(true); 374 | }); 375 | 376 | if (opt.closeOnEsc) { 377 | $(document).on('keyup', function (e) { 378 | self.onKeyUp(e); 379 | }); 380 | } 381 | 382 | if (this.mask && opt.closeOnMaskClick) { 383 | this.mask.getMask().on('click', function () { 384 | self.close(); 385 | }); 386 | } 387 | }, 388 | 389 | setupOverlay: function () { 390 | var opt = this.options, 391 | topPos = opt.top, 392 | scrollTop = $(window).scrollTop(), 393 | overlayWidth = this.$overlay.width(); 394 | 395 | // setup overlay 396 | this.$overlay 397 | .addClass(opt.cssClass) 398 | .appendTo('body'); 399 | 400 | if (opt.position === 'absolute') { 401 | topPos += scrollTop; 402 | } 403 | 404 | // width is not defined explicitly 405 | // so we try to find out 406 | if (overlayWidth === 0) { 407 | this.$overlay.css({ 408 | display: 'block', 409 | position: 'absolute', 410 | left: -9999 411 | }); 412 | overlayWidth = this.$overlay.width(); 413 | } 414 | 415 | this.$overlay.css({ 416 | display: 'none', 417 | position: opt.position, 418 | top: topPos, 419 | left: '50%', 420 | zIndex: opt.zIndex, 421 | marginLeft: overlayWidth / 2 * -1 422 | }); 423 | }, 424 | 425 | open: function (dontOpenMask) { 426 | var opt = this.options, 427 | self = this, 428 | animationIn = opt.animationIn ? clone(opt.animationIn) : false, 429 | api = this.getApi(); 430 | 431 | if (this.$overlay.css('display') === 'block' || 432 | opt.onBeforeOpen(api) === false) { 433 | return; 434 | } 435 | 436 | this.setupOverlay(); 437 | 438 | if (! opt.allowMultipleDisplay) { 439 | $(document).trigger('ender-overlay.closeOverlay'); 440 | } 441 | 442 | animate({ 443 | el: this.$overlay, 444 | animStartCss: extend({display: 'block'}, opt.startAnimationCss), 445 | animation: animationIn, 446 | complete: function () { 447 | if (animationIn && animationIn.opacity === 1) { 448 | self.$overlay.css({ 'filter': '' }); // ie quirk 449 | } 450 | self.options.onOpen(api); 451 | }, 452 | fallbackCss: {display: 'block', opacity: 1}, 453 | css3transition: opt.css3transition 454 | }); 455 | 456 | if (this.mask && 457 | typeof dontOpenMask === 'undefined') { 458 | this.mask.show(); 459 | } 460 | }, 461 | 462 | close: function (dontHideMask) { 463 | var opt = this.options, 464 | self = this, 465 | animationOut = opt.animationOut ? clone(opt.animationOut) : false, 466 | api = this.getApi(); 467 | 468 | if (opt.onBeforeClose(api) === false || 469 | this.$overlay.css('display') !== 'block') { 470 | return; 471 | } 472 | 473 | animate({ 474 | el: this.$overlay, 475 | animation: animationOut, 476 | complete: function () { 477 | self.$overlay.css({display: 'none'}); 478 | self.options.onClose(api); 479 | }, 480 | fallbackCss: {display: 'none', opacity: 0}, 481 | css3transition: opt.css3transition 482 | }); 483 | 484 | if (this.mask && 485 | typeof dontHideMask === 'undefined') { 486 | this.mask.hide(); 487 | } 488 | }, 489 | 490 | onKeyUp: function (e) { 491 | if (e.keyCode === 27 && 492 | this.$overlay.css('display') !== 'none') { 493 | this.close(); 494 | } 495 | }, 496 | 497 | getOverlay: function () { 498 | return this.$overlay; 499 | }, 500 | 501 | getOptions: function () { 502 | return this.options; 503 | }, 504 | 505 | setOptions: function (options) { 506 | extend(this.options, options || {}); 507 | var opt = this.options; 508 | 509 | if (opt.animationIn === 'none') { 510 | opt.animationIn = false; 511 | } 512 | 513 | if (opt.animationOut === 'none') { 514 | opt.animationOut = false; 515 | } 516 | 517 | if (opt.showMask) { 518 | // If there is no explicit duration set for OverlayMask 519 | // set it from overlay animation 520 | if (! opt.mask.durationIn && opt.animationIn && opt.animationIn.duration) { 521 | opt.mask.durationIn = opt.animationIn.duration; 522 | } 523 | 524 | if (! opt.mask.durationOut && opt.animationOut && opt.animationOut.duration) { 525 | opt.mask.durationOut = opt.animationOut.duration; 526 | } 527 | 528 | // no animation 529 | if (! opt.mask.durationIn && ! opt.animationIn) { 530 | opt.mask.durationIn = 0; 531 | } 532 | 533 | if (! opt.mask.durationOut && ! opt.animationOut) { 534 | opt.mask.durationOut = 0; 535 | } 536 | 537 | if (typeof opt.mask.css3transition !== 'boolean') { 538 | opt.mask.css3transition = opt.css3transition; 539 | } 540 | } 541 | 542 | }, 543 | 544 | getApi: function () { 545 | return { 546 | open: proxy(this.open, this), 547 | close: proxy(this.close, this), 548 | getOverlay: proxy(this.getOverlay, this), 549 | getOptions: proxy(this.getOptions, this), 550 | setOptions: proxy(this.setOptions, this) 551 | }; 552 | } 553 | }; 554 | 555 | $.fn.overlay = function (options) { 556 | var el = $(this).first(); 557 | return new Overlay(el, options); 558 | }; 559 | 560 | }(window.ender || window.jQuery || window.Zepto); -------------------------------------------------------------------------------- /public/media/js/jquery-1.11.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; 3 | if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("