Marked as 0.2.9

This commit is contained in:
Wu Cheng-Han 2015-06-01 18:04:25 +08:00
parent 4e64583a0b
commit f7f8c901f4
33 changed files with 2972 additions and 242 deletions

View file

@ -1,11 +1,26 @@
HackMD 0.2.8 HackMD 0.2.9
=== ===
This is a realtime collaborative markdown notes on all platforms. HackMD is a realtime collaborative markdown notes on all platforms.
But still in early stage, feel free to fork or contribute to it. Inspired by Hackpad, but more focusing on speed and flexibility.
Still in early stage, feel free to fork or contribute to this.
Thanks for your using! Thanks for your using! :smile:
Dependency
---
- PostgreSQL 9.3.6 or 9.4.1
- MongoDB 3.0.2
Import db schema
---
The notes are store in PostgreSQL, the schema is in the `hackmd_schema.sql`
To import the sql file in PostgreSQL, type `psql -i hackmd_schema.sql`
The users, temps and sessions are store in MongoDB, which don't need schema, so just make sure you have the correct connection string.
Config
---
There are some config you need to change in below files There are some config you need to change in below files
``` ```
./run.sh ./run.sh
@ -13,13 +28,25 @@ There are some config you need to change in below files
./public/js/common.js ./public/js/common.js
``` ```
You can use SSL to encrypt your site by passing certificate path in the `config.js` and set `usessl=true`. The script `run.sh`, it's for someone like me to run the server via npm package `forever`, and can passing environment variable to the server, like heroku does.
And there is a script called `run.sh`, it's for someone like me to run the server via npm package `forever`, and can passing environment variable to the server, like heroku does.
To install `forever`, just type `npm install forever -g` To install `forever`, just type `npm install forever -g`
The notes are store in PostgreSQL, and I provided the schema in the `hackmd_schema.sql`. You can use SSL to encrypt your site by passing certificate path in the `config.js` and set `usessl=true`
The users and sessions are store in mongoDB, which don't need schema, so just connect it directly.
Run a server
---
To run the server, type `bash run.sh`
Log will be at `~/.forever/hackmd.log`
Stop a server
---
To stop the server, simply type `forever stop hackmd`
Backup db
---
To backup the db, type `bash backup.sh`
Backup files will be at `./backups/`
**License under MIT.** **License under MIT.**

40
app.js
View file

@ -5,6 +5,7 @@ var toobusy = require('toobusy-js');
var ejs = require('ejs'); var ejs = require('ejs');
var passport = require('passport'); var passport = require('passport');
var methodOverride = require('method-override'); var methodOverride = require('method-override');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser'); var bodyParser = require('body-parser');
var mongoose = require('mongoose'); var mongoose = require('mongoose');
var compression = require('compression') var compression = require('compression')
@ -14,9 +15,12 @@ var fs = require('fs');
var shortid = require('shortid'); var shortid = require('shortid');
var imgur = require('imgur'); var imgur = require('imgur');
var formidable = require('formidable'); var formidable = require('formidable');
var morgan = require('morgan');
var passportSocketIo = require("passport.socketio");
//core //core
var config = require("./config.js"); var config = require("./config.js");
var logger = require("./lib/logger.js");
var User = require("./lib/user.js"); var User = require("./lib/user.js");
var Temp = require("./lib/temp.js"); var Temp = require("./lib/temp.js");
var auth = require("./lib/auth.js"); var auth = require("./lib/auth.js");
@ -45,7 +49,12 @@ if (config.usessl) {
var app = express(); var app = express();
var server = require('http').createServer(app); var server = require('http').createServer(app);
} }
//socket io listen
var io = require('socket.io').listen(server); var io = require('socket.io').listen(server);
//logger
app.use(morgan('combined', {
"stream": logger.stream
}));
// connect to the mongodb // connect to the mongodb
mongoose.connect(process.env.MONGOLAB_URI || config.mongodbstring); mongoose.connect(process.env.MONGOLAB_URI || config.mongodbstring);
@ -65,6 +74,15 @@ var urlencodedParser = bodyParser.urlencoded({
extended: false extended: false
}); });
//session store
var sessionStore = new MongoStore({
mongooseConnection: mongoose.connection,
touchAfter: config.sessiontouch
},
function (err) {
console.log(err);
});
//compression //compression
app.use(compression()); app.use(compression());
@ -79,13 +97,7 @@ app.use(session({
expires: new Date(Date.now() + config.sessionlife), expires: new Date(Date.now() + config.sessionlife),
}, },
maxAge: new Date(Date.now() + config.sessionlife), maxAge: new Date(Date.now() + config.sessionlife),
store: new MongoStore({ store: sessionStore
mongooseConnection: mongoose.connection,
touchAfter: config.sessiontouch
},
function (err) {
console.log(err);
})
})); }));
//middleware which blocks requests when we're too busy //middleware which blocks requests when we're too busy
@ -293,6 +305,7 @@ app.get('/me', function (req, res) {
var profile = JSON.parse(user.profile); var profile = JSON.parse(user.profile);
res.send({ res.send({
status: 'ok', status: 'ok',
id: req.session.passport.user,
name: profile.displayName || profile.username name: profile.displayName || profile.username
}); });
} }
@ -317,7 +330,9 @@ app.post('/uploadimage', function (req, res) {
.then(function (json) { .then(function (json) {
if (config.debug) if (config.debug)
console.log('SERVER uploadimage success: ' + JSON.stringify(json)); console.log('SERVER uploadimage success: ' + JSON.stringify(json));
res.send({link:json.data.link}); res.send({
link: json.data.link
});
}) })
.catch(function (err) { .catch(function (err) {
console.error(err); console.error(err);
@ -337,6 +352,15 @@ app.get("/:noteId/:action", response.noteActions);
//socket.io secure //socket.io secure
io.use(realtime.secure); io.use(realtime.secure);
//socket.io auth
io.use(passportSocketIo.authorize({
cookieParser: cookieParser,
key: config.sessionname,
secret: config.sessionsecret,
store: sessionStore,
success: realtime.onAuthorizeSuccess,
fail: realtime.onAuthorizeFail
}));
//socket.io heartbeat //socket.io heartbeat
io.set('heartbeat interval', config.heartbeatinterval); io.set('heartbeat interval', config.heartbeatinterval);
io.set('heartbeat timeout', config.heartbeattimeout); io.set('heartbeat timeout', config.heartbeattimeout);

7
backup.sh Normal file
View file

@ -0,0 +1,7 @@
#!/bin/bash
path=./backups
today=$(date +"%Y%m%d")
timestamp=$(date +"%Y%m%d%H%M%S")
mkdir -p $path/$today
pg_dump hackmd > $path/$today/postgresql_$timestamp
mongodump -d hackmd -o $path/$today/mongodb_$timestamp

21
lib/logger.js Normal file
View file

@ -0,0 +1,21 @@
var winston = require('winston');
winston.emitErrs = true;
var logger = new winston.Logger({
transports: [
new winston.transports.Console({
level: 'debug',
handleExceptions: true,
json: false,
colorize: true
})
],
exitOnError: false
});
module.exports = logger;
module.exports.stream = {
write: function(message, encoding){
logger.info(message);
}
};

View file

@ -7,6 +7,8 @@ var async = require('async');
var LZString = require('lz-string'); var LZString = require('lz-string');
var shortId = require('shortid'); var shortId = require('shortid');
var randomcolor = require("randomcolor"); var randomcolor = require("randomcolor");
var Chance = require('chance'),
chance = new Chance();
//core //core
var config = require("../config.js"); var config = require("../config.js");
@ -18,11 +20,22 @@ var User = require("./user.js");
//public //public
var realtime = { var realtime = {
onAuthorizeSuccess: onAuthorizeSuccess,
onAuthorizeFail: onAuthorizeFail,
secure: secure, secure: secure,
connection: connection, connection: connection,
getStatus: getStatus getStatus: getStatus
}; };
function onAuthorizeSuccess(data, accept) {
accept(null, true);
}
function onAuthorizeFail(data, message, error, accept) {
if (error) throw new Error(message);
accept(null, true);
}
function secure(socket, next) { function secure(socket, next) {
try { try {
var handshakeData = socket.request; var handshakeData = socket.request;
@ -53,8 +66,10 @@ var updater = setInterval(function () {
if (note.isDirty) { if (note.isDirty) {
if (config.debug) if (config.debug)
console.log("updater found dirty note: " + key); console.log("updater found dirty note: " + key);
var title = Note.getNoteTitle(LZString.decompressFromBase64(note.body)); var body = LZString.decompressFromUTF16(note.body);
db.saveToDB(key, title, note.body, var title = Note.getNoteTitle(body);
body = LZString.compressToBase64(body);
db.saveToDB(key, title, body,
function (err, result) {}); function (err, result) {});
note.isDirty = false; note.isDirty = false;
} }
@ -129,17 +144,25 @@ function emitOnlineUsers(socket) {
Object.keys(notes[notename].users).forEach(function (key) { Object.keys(notes[notename].users).forEach(function (key) {
var user = notes[notename].users[key]; var user = notes[notename].users[key];
if (user) if (user)
users.push({ users.push(buildUserOutData(user));
id: user.id,
color: user.color,
cursor: user.cursor
});
}); });
notes[notename].socks.forEach(function (sock) { notes[notename].socks.forEach(function (sock) {
sock.emit('online users', { var out = {
count: notes[notename].socks.length,
users: users users: users
};
out = LZString.compressToUTF16(JSON.stringify(out));
sock.emit('online users', out);
}); });
}
function emitUserStatus(socket) {
var notename = getNotenameFromSocket(socket);
if (!notename || !notes[notename]) return;
notes[notename].socks.forEach(function (sock) {
if (sock != socket) {
var out = buildUserOutData(users[socket.id]);
sock.emit('user status', out);
}
}); });
} }
@ -198,7 +221,8 @@ function startConnection(socket) {
isConnectionBusy = false; isConnectionBusy = false;
return console.error(err); return console.error(err);
} }
var body = data.rows[0].content; var body = LZString.decompressFromBase64(data.rows[0].content);
body = LZString.compressToUTF16(body);
notes[notename] = { notes[notename] = {
socks: [], socks: [],
body: body, body: body,
@ -232,8 +256,10 @@ function disconnect(socket) {
notes[notename].socks.splice(index, 1); notes[notename].socks.splice(index, 1);
} }
if (Object.keys(notes[notename].users).length <= 0) { if (Object.keys(notes[notename].users).length <= 0) {
var title = Note.getNoteTitle(LZString.decompressFromBase64(notes[notename].body)); var body = LZString.decompressFromUTF16(notes[notename].body);
db.saveToDB(notename, title, notes[notename].body, var title = Note.getNoteTitle(body);
body = LZString.compressToBase64(body);
db.saveToDB(notename, title, body,
function (err, result) { function (err, result) {
delete notes[notename]; delete notes[notename];
if (config.debug) { if (config.debug) {
@ -265,20 +291,80 @@ function disconnect(socket) {
} }
} }
function buildUserOutData(user) {
var out = {
id: user.id,
login: user.login,
userid: user.userid,
color: user.color,
cursor: user.cursor,
name: user.name,
idle: user.idle,
type: user.type
};
return out;
}
function updateUserData(socket, user) {
//retrieve user data from passport
if (socket.request.user && socket.request.user.logged_in) {
var profile = JSON.parse(socket.request.user.profile);
user.name = profile.displayName || profile.username;
user.userid = socket.request.user._id;
user.login = true;
} else {
user.userid = null;
user.name = 'Guest ' + chance.last();
user.login = false;
}
}
function connection(socket) { function connection(socket) {
//split notename from socket
var notename = getNotenameFromSocket(socket);
//initialize user data
//random color
var color = randomcolor({
luminosity: 'light'
});
//make sure color not duplicated or reach max random count
if (notename && notes[notename]) {
var randomcount = 0;
var maxrandomcount = 5;
var found = false;
do {
Object.keys(notes[notename].users).forEach(function (user) {
if (user.color == color) {
found = true;
return;
}
});
if (found) {
color = randomcolor({
luminosity: 'light'
});
randomcount++;
}
} while (found && randomcount < maxrandomcount);
}
//create user data
users[socket.id] = { users[socket.id] = {
id: socket.id, id: socket.id,
address: socket.handshake.address, address: socket.handshake.address,
'user-agent': socket.handshake.headers['user-agent'], 'user-agent': socket.handshake.headers['user-agent'],
otk: shortId.generate(), otk: shortId.generate(),
color: randomcolor({ color: color,
luminosity: 'light'
}),
cursor: null, cursor: null,
login: false login: false,
userid: null,
name: null,
idle: false,
type: null
}; };
updateUserData(socket, users[socket.id]);
//start connection
connectionSocketQueue.push(socket); connectionSocketQueue.push(socket);
startConnection(socket); startConnection(socket);
@ -294,60 +380,87 @@ function connection(socket) {
} }
}); });
//received user status
socket.on('user status', function (data) { socket.on('user status', function (data) {
if(data) var notename = getNotenameFromSocket(socket);
users[socket.id].login = data.login; if (!notename) return;
if (config.debug)
console.log('SERVER received [' + notename + '] user status from [' + socket.id + ']: ' + JSON.stringify(data));
if (data) {
var user = users[socket.id];
user.idle = data.idle;
user.type = data.type;
}
emitUserStatus(socket);
}); });
socket.on('online users', function () { //reveiced when user logout or changed
socket.on('user changed', function () {
console.log('user changed');
var notename = getNotenameFromSocket(socket);
if (!notename || !notes[notename]) return;
updateUserData(socket, notes[notename].users[socket.id]);
emitOnlineUsers(socket); emitOnlineUsers(socket);
}); });
//received sync of online users request
socket.on('online users', function () {
var notename = getNotenameFromSocket(socket);
if (!notename || !notes[notename]) return;
var users = [];
Object.keys(notes[notename].users).forEach(function (key) {
var user = notes[notename].users[key];
if (user)
users.push(buildUserOutData(user));
});
var out = {
users: users
};
out = LZString.compressToUTF16(JSON.stringify(out));
socket.emit('online users', out);
});
//check version
socket.on('version', function () { socket.on('version', function () {
socket.emit('version', config.version); socket.emit('version', config.version);
}); });
//received cursor focus
socket.on('cursor focus', function (data) { socket.on('cursor focus', function (data) {
var notename = getNotenameFromSocket(socket); var notename = getNotenameFromSocket(socket);
if (!notename || !notes[notename]) return; if (!notename || !notes[notename]) return;
users[socket.id].cursor = data; users[socket.id].cursor = data;
var out = buildUserOutData(users[socket.id]);
notes[notename].socks.forEach(function (sock) { notes[notename].socks.forEach(function (sock) {
if (sock != socket) { if (sock != socket) {
var out = {
id: socket.id,
color: users[socket.id].color,
cursor: data
};
sock.emit('cursor focus', out); sock.emit('cursor focus', out);
} }
}); });
}); });
//received cursor activity
socket.on('cursor activity', function (data) { socket.on('cursor activity', function (data) {
var notename = getNotenameFromSocket(socket); var notename = getNotenameFromSocket(socket);
if (!notename || !notes[notename]) return; if (!notename || !notes[notename]) return;
users[socket.id].cursor = data; users[socket.id].cursor = data;
var out = buildUserOutData(users[socket.id]);
notes[notename].socks.forEach(function (sock) { notes[notename].socks.forEach(function (sock) {
if (sock != socket) { if (sock != socket) {
var out = {
id: socket.id,
color: users[socket.id].color,
cursor: data
};
sock.emit('cursor activity', out); sock.emit('cursor activity', out);
} }
}); });
}); });
//received cursor blur
socket.on('cursor blur', function () { socket.on('cursor blur', function () {
var notename = getNotenameFromSocket(socket); var notename = getNotenameFromSocket(socket);
if (!notename || !notes[notename]) return; if (!notename || !notes[notename]) return;
users[socket.id].cursor = null; users[socket.id].cursor = null;
notes[notename].socks.forEach(function (sock) {
if (sock != socket) {
var out = { var out = {
id: socket.id id: socket.id
}; };
notes[notename].socks.forEach(function (sock) {
if (sock != socket) {
if (sock != socket) { if (sock != socket) {
sock.emit('cursor blur', out); sock.emit('cursor blur', out);
} }
@ -365,7 +478,7 @@ function connection(socket) {
socket.on('change', function (op) { socket.on('change', function (op) {
var notename = getNotenameFromSocket(socket); var notename = getNotenameFromSocket(socket);
if (!notename) return; if (!notename) return;
op = LZString.decompressFromBase64(op); op = LZString.decompressFromUTF16(op);
if (op) if (op)
op = JSON.parse(op); op = JSON.parse(op);
if (config.debug) if (config.debug)
@ -390,10 +503,12 @@ function connection(socket) {
if (sock != socket) { if (sock != socket) {
if (config.debug) if (config.debug)
console.log('SERVER emit sync data out [' + notename + ']: ' + sock.id + ', op:' + JSON.stringify(op)); console.log('SERVER emit sync data out [' + notename + ']: ' + sock.id + ', op:' + JSON.stringify(op));
sock.emit('change', LZString.compressToBase64(JSON.stringify(op))); sock.emit('change', LZString.compressToUTF16(JSON.stringify(op)));
} }
}); });
break; break;
default:
console.log('SERVER received uncaught [' + notename + '] data changed: ' + socket.id + ', op:' + JSON.stringify(op));
} }
}); });
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "hackmd", "name": "hackmd",
"version": "0.2.8", "version": "0.2.9",
"description": "Realtime collaborative markdown notes on all platforms.", "description": "Realtime collaborative markdown notes on all platforms.",
"main": "app.js", "main": "app.js",
"author": "jackycute", "author": "jackycute",
@ -9,6 +9,7 @@
"dependencies": { "dependencies": {
"async": "^0.9.0", "async": "^0.9.0",
"body-parser": "^1.12.3", "body-parser": "^1.12.3",
"chance": "^0.7.5",
"cheerio": "^0.19.0", "cheerio": "^0.19.0",
"compression": "^1.4.3", "compression": "^1.4.3",
"connect-mongo": "^0.8.1", "connect-mongo": "^0.8.1",
@ -27,17 +28,20 @@
"marked": "^0.3.3", "marked": "^0.3.3",
"method-override": "^2.3.2", "method-override": "^2.3.2",
"mongoose": "^4.0.2", "mongoose": "^4.0.2",
"morgan": "^1.5.3",
"node-uuid": "^1.4.3", "node-uuid": "^1.4.3",
"passport": "^0.2.1", "passport": "^0.2.1",
"passport-dropbox-oauth2": "^0.1.6", "passport-dropbox-oauth2": "^0.1.6",
"passport-facebook": "^2.0.0", "passport-facebook": "^2.0.0",
"passport-github": "^0.1.5", "passport-github": "^0.1.5",
"passport-twitter": "^1.0.3", "passport-twitter": "^1.0.3",
"passport.socketio": "^3.5.1",
"pg": "4.x", "pg": "4.x",
"randomcolor": "^0.2.0", "randomcolor": "^0.2.0",
"shortid": "2.1.3", "shortid": "2.1.3",
"socket.io": "1.3.5", "socket.io": "1.3.5",
"toobusy-js": "^0.4.1" "toobusy-js": "^0.4.1",
"winston": "^1.0.0"
}, },
"engines": { "engines": {
"node": "0.10.x" "node": "0.10.x"

View file

@ -20,7 +20,6 @@ form,
font-family: 'Source Code Pro', Consolas, monaco, monospace; font-family: 'Source Code Pro', Consolas, monaco, monospace;
line-height: 18px; line-height: 18px;
font-size: 16px; font-size: 16px;
/*height: auto;*/
min-height: 100%; min-height: 100%;
overflow-y: hidden !important; overflow-y: hidden !important;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
@ -30,7 +29,7 @@ form,
overflow-y: auto !important; overflow-y: auto !important;
} }
.CodeMirror-code { .CodeMirror-code {
/*padding-bottom: 72px;*/ padding-bottom: 36px;
} }
.CodeMirror-linenumber { .CodeMirror-linenumber {
opacity: 0.5; opacity: 0.5;
@ -73,23 +72,82 @@ form,
font-size: 14px; font-size: 14px;
} }
.nav-mobile { .nav-mobile {
position: relative; position: inherit;
margin-top: 8px; margin-top: 8px;
margin-bottom: 8px; margin-bottom: 8px;
} }
.nav-mobile .dropdown-menu {
left: 40%;
right: 6px;
top: 42px;
}
.nav-status { .nav-status {
float: right !important; float: right !important;
padding: 7px 8px; padding: 7px 8px;
} }
.ui-status { .ui-status {
cursor: auto !important;
min-width: 120px; min-width: 120px;
background-color: transparent !important;
}
.ui-status span {
cursor: pointer;
} }
.ui-short-status { .ui-short-status {
cursor: pointer;
min-width: 40px; min-width: 40px;
} }
.ui-short-status:hover {
text-decoration: none;
}
.ui-user-item {
/*na*/
}
.ui-user-name {
margin-top: 2px;
}
.ui-user-icon {
font-size: 20px;
margin-top: 2px;
margin-right: 5px;
}
.ui-user-status {
margin-top: 5px;
}
.ui-user-status-online {
color: rgb(92,184,92);
}
.ui-user-status-idle {
color: rgb(240,173,78);
}
.ui-user-status-offline {
color: rgb(119,119,119);
}
.list > li > a {
overflow: hidden;
text-overflow: ellipsis;
}
#short-online-user-list .list .name {
max-width: 65%;
overflow: hidden;
text-overflow: ellipsis;
float: left;
}
#online-user-list .list .name {
max-width: 110px;
overflow: hidden;
text-overflow: ellipsis;
float: left;
}
.navbar-right { .navbar-right {
margin-right: 0; margin-right: 0;
} }
.navbar-nav > li > a {
cursor: pointer;
}
.dropdown-menu > li > a {
cursor: pointer;
}
.other-cursors { .other-cursors {
position:relative; position:relative;
z-index:3; z-index:3;
@ -99,6 +157,19 @@ form,
position: absolute; position: absolute;
border-right: none; border-right: none;
} }
.cursortag {
cursor: pointer;
background: black;
position: absolute;
padding: 2px 7px 2px 8px;
font-size: 12px;
max-width: 150px;
text-overflow: ellipsis;
overflow: hidden;
font-family: inherit;
border-radius: .25em;
white-space: nowrap;
}
.fixfixed .navbar-fixed-top { .fixfixed .navbar-fixed-top {
position: absolute !important; position: absolute !important;
} }
@ -106,3 +177,43 @@ div[contenteditable]:empty:not(:focus):before{
content:attr(data-ph); content:attr(data-ph);
color: gray; color: gray;
} }
.dropdown-menu {
max-height: 80vh;
overflow: auto;
}
.dropdown-menu::-webkit-scrollbar {
display: none;
}
.dropdown-menu .emoji {
margin-bottom: 0 !important;
}
.dropdown-menu.other-cursor {
width: auto !important;
}
.CodeMirror-scrollbar-filler {
background: inherit;
}
.unselectable {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
user-select: none;
}
.cm-trailing-space-a:before,
.cm-trailing-space-b:before,
.cm-trailing-space-new-line:before {
font-weight: bold;
color: hsl(30, 100%, 50%); /* a dark orange */
position: absolute;
}
.cm-trailing-space-a:before,
.cm-trailing-space-b:before {
content: '·';
}
.cm-trailing-space-new-line:before {
content: '↵';
}

View file

@ -81,8 +81,8 @@
</div> </div>
<hr> <hr>
<form class="form-inline"> <form class="form-inline">
<div class="form-group"> <div class="form-group" style="vertical-align: bottom;">
<input class="form-control ui-use-tags" style="width:172px;" /> <input class="form-control ui-use-tags" style="min-width:172px;max-width:344px;" />
</div> </div>
<div class="form-group"> <div class="form-group">
<input class="search form-control" placeholder="Search anything..." /> <input class="search form-control" placeholder="Search anything..." />
@ -188,6 +188,8 @@
<!-- Placed at the end of the document so the pages load faster --> <!-- Placed at the end of the document so the pages load faster -->
<script src="/js/fb.js" async defer></script> <script src="/js/fb.js" async defer></script>
<script src="//code.jquery.com/jquery-1.11.3.min.js" defer></script> <script src="//code.jquery.com/jquery-1.11.3.min.js" defer></script>
<script src="/vendor/greensock-js/TweenMax.min.js" defer></script>
<script src="/vendor/greensock-js/jquery.gsap.min.js" defer></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" defer></script> <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" defer></script>
<script src="/vendor/select2/select2.min.js" defer></script> <script src="/vendor/select2/select2.min.js" defer></script>
<script src="/vendor/js.cookie.js" defer></script> <script src="/vendor/js.cookie.js" defer></script>

View file

@ -3,38 +3,62 @@ var domain = 'change this';
var checkAuth = false; var checkAuth = false;
var profile = null; var profile = null;
var lastLoginState = getLoginState(); var lastLoginState = getLoginState();
var lastUserId = getUserId();
var loginStateChangeEvent = null; var loginStateChangeEvent = null;
function resetCheckAuth() { function resetCheckAuth() {
checkAuth = false; checkAuth = false;
} }
function setLoginState(bool) { function setLoginState(bool, id) {
Cookies.set('loginstate', bool, { Cookies.set('loginstate', bool, {
expires: 14 expires: 14
}); });
if (loginStateChangeEvent && bool != lastLoginState) if (id) {
loginStateChangeEvent(); Cookies.set('userid', id, {
expires: 14
});
} else {
Cookies.remove('userid');
}
lastLoginState = bool; lastLoginState = bool;
lastUserId = id;
checkLoginStateChanged();
}
function checkLoginStateChanged() {
if (getLoginState() != lastLoginState || getUserId() != lastUserId) {
if(loginStateChangeEvent)
loginStateChangeEvent();
return true;
} else {
return false;
}
} }
function getLoginState() { function getLoginState() {
return Cookies.get('loginstate') === "true"; return Cookies.get('loginstate') === "true";
} }
function getUserId() {
return Cookies.get('userid');
}
function clearLoginState() { function clearLoginState() {
Cookies.remove('loginstate'); Cookies.remove('loginstate');
} }
function checkIfAuth(yesCallback, noCallback) { function checkIfAuth(yesCallback, noCallback) {
var cookieLoginState = getLoginState(); var cookieLoginState = getLoginState();
if (checkLoginStateChanged())
checkAuth = false;
if (!checkAuth || typeof cookieLoginState == 'undefined') { if (!checkAuth || typeof cookieLoginState == 'undefined') {
$.get('/me') $.get('/me')
.done(function (data) { .done(function (data) {
if (data && data.status == 'ok') { if (data && data.status == 'ok') {
profile = data; profile = data;
yesCallback(profile); yesCallback(profile);
setLoginState(true); setLoginState(true, data.id);
} else { } else {
noCallback(); noCallback();
setLoginState(false); setLoginState(false);
@ -43,8 +67,10 @@ function checkIfAuth(yesCallback, noCallback) {
.fail(function () { .fail(function () {
noCallback(); noCallback();
setLoginState(false); setLoginState(false);
}); })
.always(function () {
checkAuth = true; checkAuth = true;
});
} else if (cookieLoginState) { } else if (cookieLoginState) {
yesCallback(profile); yesCallback(profile);
} else { } else {

View file

@ -229,6 +229,44 @@ var source = $("#template").html();
var template = Handlebars.compile(source); var template = Handlebars.compile(source);
var context = { var context = {
release: [ release: [
{
version: "0.2.9",
tag: "wildfire",
date: moment("201505301400", 'YYYYMMDDhhmm').fromNow(),
detail: [
{
title: "Features",
item: [
"+ Support text auto complete",
"+ Support cursor tag and random last name",
"+ Support online user list",
"+ Support show user info in blockquote"
]
},
{
title: "Enhancements",
item: [
"* Added more code highlighting support",
"* Added more continue list support",
"* Adjust menu and history filter UI for better UX",
"* Adjust sync scoll animte to gain performance",
"* Change compression method of dynamic data",
"* Optimized render script"
]
},
{
title: "Fixes",
item: [
"* Access history fallback might get wrong",
"* Sync scroll not accurate",
"* Sync scroll reach bottom range too much",
"* Detect login state change not accurate",
"* Detect editor focus not accurate",
"* Server not handle some editor events"
]
}
]
},
{ {
version: "0.2.8", version: "0.2.8",
tag: "flame", tag: "flame",

View file

@ -65,6 +65,7 @@ function finishView(view) {
try { try {
for (var i = 0; i < mathjaxdivs.length; i++) { for (var i = 0; i < mathjaxdivs.length; i++) {
MathJax.Hub.Queue(["Typeset", MathJax.Hub, mathjaxdivs[i].innerHTML]); MathJax.Hub.Queue(["Typeset", MathJax.Hub, mathjaxdivs[i].innerHTML]);
MathJax.Hub.Queue(viewAjaxCallback);
$(mathjaxdivs[i]).removeClass("mathjax"); $(mathjaxdivs[i]).removeClass("mathjax");
} }
} catch(err) { } catch(err) {
@ -101,6 +102,18 @@ function finishView(view) {
//render title //render title
document.title = renderTitle(view); document.title = renderTitle(view);
} }
//regex for blockquote
var spaceregex = /\s*/;
var notinhtmltagregex = /(?![^<]*>|[^<>]*<\/)/;
var coloregex = /\[color=([#|\(|\)|\s|\,|\w]*)\]/;
coloregex = new RegExp(coloregex.source + notinhtmltagregex.source, "g");
var nameregex = /\[name=([-|_|\s|\w]*)\]/;
var timeregex = /\[time=([:|,|+|-|\(|\)|\s|\w]*)\]/;
var nameandtimeregex = new RegExp(nameregex.source + spaceregex.source + timeregex.source + notinhtmltagregex.source, "g");
nameregex = new RegExp(nameregex.source + notinhtmltagregex.source, "g");
timeregex = new RegExp(timeregex.source + notinhtmltagregex.source, "g");
//only static transform should be here //only static transform should be here
function postProcess(code) { function postProcess(code) {
var result = $('<div>' + code + '</div>'); var result = $('<div>' + code + '</div>');
@ -121,6 +134,20 @@ function postProcess(code) {
lis[i].setAttribute('class', 'task-list-item'); lis[i].setAttribute('class', 'task-list-item');
} }
} }
//blockquote
var blockquote = result.find("blockquote");
blockquote.each(function (key, value) {
var html = $(value).html();
html = html.replace(coloregex, '<span class="color" data-color="$1"></span>');
html = html.replace(nameandtimeregex, '<small><i class="fa fa-user"></i> $1 <i class="fa fa-clock-o"></i> $2</small>');
html = html.replace(nameregex, '<small><i class="fa fa-user"></i> $1</small>');
html = html.replace(timeregex, '<small><i class="fa fa-clock-o"></i> $1</small>');
$(value).html(html);
});
var blockquotecolor = result.find("blockquote .color");
blockquotecolor.each(function (key, value) {
$(value).closest("blockquote").css('border-left-color', $(value).attr('data-color'));
});
return result; return result;
} }
@ -195,7 +222,7 @@ function highlightRender(code, lang) {
if (/\=$/.test(lang)) { if (/\=$/.test(lang)) {
var lines = result.value.split('\n'); var lines = result.value.split('\n');
var linenumbers = []; var linenumbers = [];
for (var i = 0; i < lines.length; i++) { for (var i = 0; i < lines.length - 1; i++) {
linenumbers[i] = "<div class='linenumber'>" + (i + 1) + "</div>"; linenumbers[i] = "<div class='linenumber'>" + (i + 1) + "</div>";
} }
var linegutter = "<div class='gutter'>" + linenumbers.join('\n') + "</div>"; var linegutter = "<div class='gutter'>" + linenumbers.join('\n') + "</div>";

View file

@ -47,7 +47,7 @@ function saveHistoryToStorage(notehistory) {
if (store.enabled) if (store.enabled)
store.set('notehistory', JSON.stringify(notehistory)); store.set('notehistory', JSON.stringify(notehistory));
else else
saveHistoryToCookie(notehistory); saveHistoryToStorage(notehistory);
} }
function saveHistoryToCookie(notehistory) { function saveHistoryToCookie(notehistory) {
@ -146,11 +146,14 @@ function writeHistoryToServer(view) {
} catch (err) { } catch (err) {
var notehistory = []; var notehistory = [];
} }
if(!notehistory)
notehistory = [];
var newnotehistory = generateHistory(view, notehistory); var newnotehistory = generateHistory(view, notehistory);
saveHistoryToServer(newnotehistory); saveHistoryToServer(newnotehistory);
}) })
.fail(function () { .fail(function () {
writeHistoryToCookie(view); writeHistoryToStorage(view);
}); });
} }
@ -160,6 +163,8 @@ function writeHistoryToCookie(view) {
} catch (err) { } catch (err) {
var notehistory = []; var notehistory = [];
} }
if(!notehistory)
notehistory = [];
var newnotehistory = generateHistory(view, notehistory); var newnotehistory = generateHistory(view, notehistory);
saveHistoryToCookie(newnotehistory); saveHistoryToCookie(newnotehistory);
@ -174,6 +179,9 @@ function writeHistoryToStorage(view) {
var notehistory = data; var notehistory = data;
} else } else
var notehistory = []; var notehistory = [];
if(!notehistory)
notehistory = [];
var newnotehistory = generateHistory(view, notehistory); var newnotehistory = generateHistory(view, notehistory);
saveHistoryToStorage(newnotehistory); saveHistoryToStorage(newnotehistory);
} else { } else {
@ -241,7 +249,7 @@ function getServerHistory(callback) {
} }
}) })
.fail(function () { .fail(function () {
getCookieHistory(callback); getStorageHistory(callback);
}); });
} }
@ -282,7 +290,7 @@ function parseServerToHistory(list, callback) {
} }
}) })
.fail(function () { .fail(function () {
parseCookieToHistory(list, callback); parseStorageToHistory(list, callback);
}); });
} }

File diff suppressed because it is too large Load diff

View file

@ -144,10 +144,14 @@ md.renderer.rules.code = function (tokens, idx /*, options, env */ ) {
return '<code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code>'; return '<code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code>';
}; };
//var editorScrollThrottle = 100;
var buildMapThrottle = 100;
var viewScrolling = false; var viewScrolling = false;
var viewScrollingDelay = 200; var viewScrollingDelay = 200;
var viewScrollingTimer = null; var viewScrollingTimer = null;
//editor.on('scroll', _.throttle(syncScrollToView, editorScrollThrottle));
editor.on('scroll', syncScrollToView); editor.on('scroll', syncScrollToView);
ui.area.view.on('scroll', function () { ui.area.view.on('scroll', function () {
viewScrolling = true; viewScrolling = true;
@ -168,10 +172,12 @@ function clearMap() {
lineHeightMap = null; lineHeightMap = null;
} }
var buildMap = _.throttle(buildMapInner, buildMapThrottle);
// Build offsets for each line (lines can be wrapped) // Build offsets for each line (lines can be wrapped)
// That's a bit dirty to process each line everytime, but ok for demo. // That's a bit dirty to process each line everytime, but ok for demo.
// Optimizations are required only for big texts. // Optimizations are required only for big texts.
function buildMap() { function buildMapInner(syncBack) {
var i, offset, nonEmptyList, pos, a, b, _lineHeightMap, linesCount, var i, offset, nonEmptyList, pos, a, b, _lineHeightMap, linesCount,
acc, sourceLikeDiv, textarea = ui.area.codemirror, acc, sourceLikeDiv, textarea = ui.area.codemirror,
wrap = $('.CodeMirror-wrap pre'), wrap = $('.CodeMirror-wrap pre'),
@ -182,8 +188,6 @@ function buildMap() {
visibility: 'hidden', visibility: 'hidden',
height: 'auto', height: 'auto',
width: wrap.width(), width: wrap.width(),
padding: wrap.css('padding'),
margin: wrap.css('margin'),
'font-size': textarea.css('font-size'), 'font-size': textarea.css('font-size'),
'font-family': textarea.css('font-family'), 'font-family': textarea.css('font-family'),
'line-height': textarea.css('line-height'), 'line-height': textarea.css('line-height'),
@ -198,21 +202,23 @@ function buildMap() {
_lineHeightMap = []; _lineHeightMap = [];
acc = 0; acc = 0;
editor.getValue().split('\n').forEach(function (str) { var lines = editor.getValue().split('\n');
for (i = 0; i < lines.length; i++) {
var str = lines[i];
var h, lh; var h, lh;
_lineHeightMap.push(acc); _lineHeightMap.push(acc);
if (str.length === 0) { if (str.length === 0) {
acc++; acc++;
return; continue;
} }
sourceLikeDiv.text(str); sourceLikeDiv.text(str);
h = parseFloat(sourceLikeDiv.css('height')); h = parseFloat(sourceLikeDiv.css('height'));
lh = parseFloat(sourceLikeDiv.css('line-height')); lh = parseFloat(sourceLikeDiv.css('line-height'));
acc += Math.round(h / lh); acc += Math.round(h / lh);
}); }
sourceLikeDiv.remove(); sourceLikeDiv.remove();
_lineHeightMap.push(acc); _lineHeightMap.push(acc);
linesCount = acc; linesCount = acc;
@ -224,9 +230,10 @@ function buildMap() {
nonEmptyList.push(0); nonEmptyList.push(0);
_scrollMap[0] = 0; _scrollMap[0] = 0;
ui.area.markdown.find('.part').each(function (n, el) { var parts = ui.area.markdown.find('.part').toArray();
var $el = $(el), for (i = 0; i < parts.length; i++) {
t = $el.data('startline') - 1; var $el = $(parts[i]),
t = $el.attr('data-startline') - 1;
if (t === '') { if (t === '') {
return; return;
} }
@ -235,7 +242,7 @@ function buildMap() {
nonEmptyList.push(t); nonEmptyList.push(t);
} }
_scrollMap[t] = Math.round($el.offset().top + offset); _scrollMap[t] = Math.round($el.offset().top + offset);
}); }
nonEmptyList.push(linesCount); nonEmptyList.push(linesCount);
_scrollMap[linesCount] = ui.area.view[0].scrollHeight; _scrollMap[linesCount] = ui.area.view[0].scrollHeight;
@ -256,6 +263,9 @@ function buildMap() {
scrollMap = _scrollMap; scrollMap = _scrollMap;
lineHeightMap = _lineHeightMap; lineHeightMap = _lineHeightMap;
if(loaded && syncBack)
syncScrollToView();
} }
function getPartByEditorLineNo(lineNo) { function getPartByEditorLineNo(lineNo) {
@ -290,20 +300,20 @@ function getEditorLineNoByTop(top) {
return null; return null;
} }
function syncScrollToView(_lineNo) { function syncScrollToView(event, _lineNo) {
if (currentMode != modeType.both) return;
var lineNo, posTo; var lineNo, posTo;
var scrollInfo = editor.getScrollInfo(); var scrollInfo = editor.getScrollInfo();
if (!scrollMap || !lineHeightMap) { if (!scrollMap || !lineHeightMap) {
buildMap(); buildMap(true);
return;
} }
if (typeof _lineNo != "number") { if (!_lineNo) {
var topDiffPercent, posToNextDiff; var topDiffPercent, posToNextDiff;
var textHeight = editor.defaultTextHeight(); var textHeight = editor.defaultTextHeight();
lineNo = Math.floor(scrollInfo.top / textHeight); lineNo = Math.floor(scrollInfo.top / textHeight);
var lineCount = editor.lineCount(); //if reach bottom, then scroll to end
var lastLineHeight = editor.getLineHandle(lineCount - 1).height; if (scrollInfo.top + scrollInfo.clientHeight >= scrollInfo.height - defaultTextHeight) {
//if reach last line, then scroll to end
if (scrollInfo.top + scrollInfo.clientHeight >= scrollInfo.height - lastLineHeight) {
posTo = ui.area.view[0].scrollHeight - ui.area.view.height(); posTo = ui.area.view[0].scrollHeight - ui.area.view.height();
} else { } else {
topDiffPercent = (scrollInfo.top % textHeight) / textHeight; topDiffPercent = (scrollInfo.top % textHeight) / textHeight;
@ -316,12 +326,18 @@ function syncScrollToView(_lineNo) {
posTo = scrollMap[lineHeightMap[_lineNo]]; posTo = scrollMap[lineHeightMap[_lineNo]];
} }
var posDiff = Math.abs(ui.area.view.scrollTop() - posTo); var posDiff = Math.abs(ui.area.view.scrollTop() - posTo);
var duration = posDiff / 50;
ui.area.view.stop(true, true).animate({
scrollTop: posTo
}, duration >= 100 ? duration : 100, "linear");
/*
if (posDiff > scrollInfo.clientHeight / 5) { if (posDiff > scrollInfo.clientHeight / 5) {
var duration = posDiff / 50; var duration = posDiff / 50;
ui.area.view.stop(true).animate({ ui.area.view.stop(true, true).animate({
scrollTop: posTo scrollTop: posTo
}, duration >= 50 ? duration : 100, "linear"); }, duration >= 100 ? duration : 100, "linear");
} else { } else {
ui.area.view.stop(true).scrollTop(posTo); ui.area.view.stop(true, true).scrollTop(posTo);
} }
*/
} }

View file

@ -63,7 +63,7 @@
} }
for (var i = ranges.length - 1; i >= 0; i--) { for (var i = ranges.length - 1; i >= 0; i--) {
var cur = ranges[i].head; var cur = ranges[i].head;
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete");
} }
} }
@ -79,7 +79,7 @@
if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
} }
cm.operation(function() { cm.operation(function() {
cm.replaceSelection("\n\n", null); cm.replaceSelection("\n\n", null, "+input");
cm.execCommand("goCharLeft"); cm.execCommand("goCharLeft");
ranges = cm.listSelections(); ranges = cm.listSelections();
for (var i = 0; i < ranges.length; i++) { for (var i = 0; i < ranges.length; i++) {
@ -144,12 +144,12 @@
var sels = cm.getSelections(); var sels = cm.getSelections();
for (var i = 0; i < sels.length; i++) for (var i = 0; i < sels.length; i++)
sels[i] = left + sels[i] + right; sels[i] = left + sels[i] + right;
cm.replaceSelections(sels, "around"); cm.replaceSelections(sels, "around", "+input");
} else if (type == "both") { } else if (type == "both") {
cm.replaceSelection(left + right, null); cm.replaceSelection(left + right, null, "+input");
cm.execCommand("goCharLeft"); cm.execCommand("goCharLeft");
} else if (type == "addFour") { } else if (type == "addFour") {
cm.replaceSelection(left + left + left + left, "before"); cm.replaceSelection(left + left + left + left, "before", "+input");
cm.execCommand("goCharRight"); cm.execCommand("goCharRight");
} }
}); });

View file

@ -11,8 +11,8 @@
})(function(CodeMirror) { })(function(CodeMirror) {
"use strict"; "use strict";
var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/, var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\[\s\]\s|\[x\]\s|\s*)/,
emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/, emptyListRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\[\s\]\s*|\[x\]\s|\s*)$/,
unorderedListRE = /[*+-]\s/; unorderedListRE = /[*+-]\s/;
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,8 @@
uglifyjs --compress --mangle --output codemirror.min.js \ uglifyjs --compress --mangle --output codemirror.min.js \
lib/codemirror.js \ lib/codemirror.js \
addon/mode/overlay.js \ addon/mode/overlay.js \
addon/mode/simple.js \
addon/mode/multiplex.js \
addon/selection/active-line.js \ addon/selection/active-line.js \
addon/search/searchcursor.js \ addon/search/searchcursor.js \
addon/search/search.js \ addon/search/search.js \
@ -14,6 +16,7 @@ addon/edit/matchtags.js \
addon/edit/closetag.js \ addon/edit/closetag.js \
addon/edit/continuelist.js \ addon/edit/continuelist.js \
addon/comment/comment.js \ addon/comment/comment.js \
addon/comment/continuecomment.js \
addon/wrap/hardwrap.js \ addon/wrap/hardwrap.js \
addon/fold/foldcode.js \ addon/fold/foldcode.js \
addon/fold/brace-fold.js \ addon/fold/brace-fold.js \
@ -26,7 +29,22 @@ mode/gfm/gfm.js \
mode/javascript/javascript.js \ mode/javascript/javascript.js \
mode/css/css.js \ mode/css/css.js \
mode/htmlmixed/htmlmixed.js \ mode/htmlmixed/htmlmixed.js \
mode/htmlembedded/htmlembedded.js \
mode/clike/clike.js \ mode/clike/clike.js \
mode/clojure/clojure.js \ mode/clojure/clojure.js \
mode/ruby/ruby.js \ mode/ruby/ruby.js \
mode/python/python.js \
mode/shell/shell.js \
mode/php/php.js \
mode/sql/sql.js \
mode/coffeescript/coffeescript.js \
mode/yaml/yaml.js \
mode/jade/jade.js \
mode/lua/lua.js \
mode/cmake/cmake.js \
mode/nginx/nginx.js \
mode/perl/perl.js \
mode/sass/sass.js \
mode/r/r.js \
mode/dockerfile/dockerfile.js \
keymap/sublime.js keymap/sublime.js

View file

@ -388,7 +388,7 @@
viewWidth: d.wrapper.clientWidth, viewWidth: d.wrapper.clientWidth,
barLeft: cm.options.fixedGutter ? gutterW : 0, barLeft: cm.options.fixedGutter ? gutterW : 0,
docHeight: docH, docHeight: docH,
scrollHeight: docH + scrollGap(cm) + d.barHeight, scrollHeight: docH + scrollGap(cm) + d.barHeight + textHeight(cm.display),
nativeBarWidth: d.nativeBarWidth, nativeBarWidth: d.nativeBarWidth,
gutterWidth: gutterW gutterWidth: gutterW
}; };
@ -2287,9 +2287,13 @@
} }
$('.other-cursor').each(function(key, value) { $('.other-cursor').each(function(key, value) {
var coord = cm.charCoords({line:$(value).attr('data-line'), ch:$(value).attr('data-ch')}, 'windows'); var line = parseInt($(value).attr('data-line'));
$(value)[0].style.left = coord.left + 'px'; var ch = parseInt($(value).attr('data-ch'));
$(value)[0].style.top = coord.top + 'px'; var offsetLeft = parseFloat($(value).attr('data-offset-left'));
var offsetTop = parseFloat($(value).attr('data-offset-top'));
var coord = cm.charCoords({line: line, ch: ch}, 'windows');
$(value)[0].style.left = coord.left + offsetLeft + 'px';
$(value)[0].style.top = coord.top + offsetTop + 'px';
}); });
} }

17
public/vendor/greensock-js/TweenMax.min.js vendored Executable file

File diff suppressed because one or more lines are too long

14
public/vendor/greensock-js/jquery.gsap.min.js vendored Executable file
View file

@ -0,0 +1,14 @@
/*!
* VERSION: 0.1.11
* DATE: 2015-03-13
* UPDATES AND DOCS AT: http://greensock.com/jquery-gsap-plugin/
*
* Requires TweenLite version 1.8.0 or higher and CSSPlugin.
*
* @license Copyright (c) 2013-2015, GreenSock. All rights reserved.
* This work is subject to the terms at http://greensock.com/standard-license or for
* Club GreenSock members, the software agreement that was issued with your membership.
*
* @author: Jack Doyle, jack@greensock.com
*/
(function(t){"use strict";var e,i,s,r=t.fn.animate,n=t.fn.stop,a=!0,o=function(t){var e,i={};for(e in t)i[e]=t[e];return i},h={overwrite:1,delay:1,useFrames:1,runBackwards:1,easeParams:1,yoyo:1,immediateRender:1,repeat:1,repeatDelay:1,autoCSS:1},l=",scrollTop,scrollLeft,show,hide,toggle,",_=l,u=function(t,e){for(var i in h)h[i]&&void 0!==t[i]&&(e[i]=t[i])},f=function(t){return function(e){return t.getRatio(e)}},c={},p=function(){var r,n,a,o=window.GreenSockGlobals||window;if(e=o.TweenMax||o.TweenLite,e&&(r=(e.version+".0.0").split("."),n=!(Number(r[0])>0&&Number(r[1])>7),o=o.com.greensock,i=o.plugins.CSSPlugin,c=o.easing.Ease.map||{}),!e||!i||n)return e=null,!s&&window.console&&(window.console.log("The jquery.gsap.js plugin requires the TweenMax (or at least TweenLite and CSSPlugin) JavaScript file(s)."+(n?" Version "+r.join(".")+" is too old.":"")),s=!0),void 0;if(t.easing){for(a in c)t.easing[a]=f(c[a]);p=!1}};t.fn.animate=function(s,n,h,l){if(s=s||{},p&&(p(),!e||!i))return r.call(this,s,n,h,l);if(!a||s.skipGSAP===!0||"object"==typeof n&&"function"==typeof n.step)return r.call(this,s,n,h,l);var f,m,d,g,v=t.speed(n,h,l),y={ease:c[v.easing]||(v.easing===!1?c.linear:c.swing)},T=this,w="object"==typeof n?n.specialEasing:null;for(m in s){if(f=s[m],f instanceof Array&&c[f[1]]&&(w=w||{},w[m]=f[1],f=f[0]),"show"===f||"hide"===f||"toggle"===f||-1!==_.indexOf(m)&&-1!==_.indexOf(","+m+","))return r.call(this,s,n,h,l);y[-1===m.indexOf("-")?m:t.camelCase(m)]=f}if(w){y=o(y),g=[];for(m in w)f=g[g.length]={},u(y,f),f.ease=c[w[m]]||y.ease,-1!==m.indexOf("-")&&(m=t.camelCase(m)),f[m]=y[m],delete y[m];0===g.length&&(g=null)}return d=function(i){var s,r=o(y);if(g)for(s=g.length;--s>-1;)e.to(this,t.fx.off?0:v.duration/1e3,g[s]);r.onComplete=function(){i?i():v.old&&t(this).each(v.old)},e.to(this,t.fx.off?0:v.duration/1e3,r)},v.queue!==!1?(T.queue(v.queue,d),"function"==typeof v.old&&T.queue(v.queue,function(t){v.old.call(this),t()})):d.call(T),T},t.fn.stop=function(t,i){if(n.call(this,t,i),e){if(i)for(var s,r=e.getTweensOf(this),a=r.length;--a>-1;)s=r[a].totalTime()/r[a].totalDuration(),s>0&&1>s&&r[a].seek(r[a].totalDuration());e.killTweensOf(this)}return this},t.gsap={enabled:function(t){a=t},version:"0.1.11",legacyProps:function(t){_=l+t+","}}})(jQuery);

160
public/vendor/idle.js vendored Executable file
View file

@ -0,0 +1,160 @@
(function() {
var Idle;
/** IE8/old browser support **/
if (!document.addEventListener) {
if (document.attachEvent) {
document.addEventListener = function(event, callback, useCapture) {
return document.attachEvent("on" + event, callback, useCapture);
};
} else {
document.addEventListener = function() {
return {};
};
}
}
if (!document.removeEventListener) {
if (document.detachEvent) {
document.removeEventListener = function(event, callback) {
return document.detachEvent("on" + event, callback);
};
} else {
document.removeEventListener = function() {
return {};
};
}
}
"use strict";
Idle = {};
Idle = (function() {
Idle.isAway = false;
Idle.awayTimeout = 3000;
Idle.awayTimestamp = 0;
Idle.awayTimer = null;
Idle.onAway = null;
Idle.onAwayBack = null;
Idle.onVisible = null;
Idle.onHidden = null;
function Idle(options) {
var activeMethod, activity;
if (options) {
this.awayTimeout = parseInt(options.awayTimeout, 10);
this.onAway = options.onAway;
this.onAwayBack = options.onAwayBack;
this.onVisible = options.onVisible;
this.onHidden = options.onHidden;
}
activity = this;
activeMethod = function() {
return activity.onActive();
};
window.onclick = activeMethod;
window.onmousemove = activeMethod;
window.onmouseenter = activeMethod;
window.onkeydown = activeMethod;
window.onscroll = activeMethod;
window.onmousewheel = activeMethod;
}
Idle.prototype.onActive = function() {
this.awayTimestamp = new Date().getTime() + this.awayTimeout;
if (this.isAway) {
this.isAway = false;
if (this.onAwayBack) {
this.onAwayBack();
}
this.start();
}
return true;
};
Idle.prototype.start = function() {
var activity;
if (!this.listener) {
this.listener = (function() {
return activity.handleVisibilityChange();
});
document.addEventListener("visibilitychange", this.listener, false);
document.addEventListener("webkitvisibilitychange", this.listener, false);
document.addEventListener("msvisibilitychange", this.listener, false);
}
this.awayTimestamp = new Date().getTime() + this.awayTimeout;
if (this.awayTimer !== null) {
clearTimeout(this.awayTimer);
}
activity = this;
this.awayTimer = setTimeout((function() {
return activity.checkAway();
}), this.awayTimeout + 100);
return this;
};
Idle.prototype.stop = function() {
if (this.awayTimer !== null) {
clearTimeout(this.awayTimer);
}
if (this.listener !== null) {
document.removeEventListener("visibilitychange", this.listener);
document.removeEventListener("webkitvisibilitychange", this.listener);
document.removeEventListener("msvisibilitychange", this.listener);
this.listener = null;
}
return this;
};
Idle.prototype.setAwayTimeout = function(ms) {
this.awayTimeout = parseInt(ms, 10);
return this;
};
Idle.prototype.checkAway = function() {
var activity, t;
t = new Date().getTime();
if (t < this.awayTimestamp) {
this.isAway = false;
activity = this;
this.awayTimer = setTimeout((function() {
return activity.checkAway();
}), this.awayTimestamp - t + 100);
return;
}
if (this.awayTimer !== null) {
clearTimeout(this.awayTimer);
}
this.isAway = true;
if (this.onAway) {
return this.onAway();
}
};
Idle.prototype.handleVisibilityChange = function() {
if (document.hidden || document.msHidden || document.webkitHidden) {
if (this.onHidden) {
return this.onHidden();
}
} else {
if (this.onVisible) {
return this.onVisible();
}
}
};
return Idle;
})();
window.Idle = Idle;
}).call(this);

View file

@ -0,0 +1,33 @@
/* Sample */
.dropdown-menu {
border: 1px solid #ddd;
background-color: white;
}
.dropdown-menu li {
border-top: 1px solid #ddd;
padding: 2px 5px;
}
.dropdown-menu li:first-child {
border-top: none;
}
.dropdown-menu li:hover,
.dropdown-menu .active {
background-color: rgb(110, 183, 219);
}
/* SHOULD not modify */
.dropdown-menu {
list-style: none;
padding: 0;
margin: 0;
}
.dropdown-menu a:hover {
cursor: pointer;
}

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

98
public/vendor/lodash.min.js vendored Normal file
View file

@ -0,0 +1,98 @@
/**
* @license
* lodash 3.9.3 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
* Build: `lodash modern -o ./lodash.js`
*/
;(function(){function n(n,t){if(n!==t){var r=null===n,e=n===m,u=n===n,i=null===t,o=t===m,f=t===t;if(n>t&&!i||!u||r&&!o&&f||e&&f)return 1;if(n<t&&!r||!f||i&&!e&&u||o&&u)return-1}return 0}function t(n,t,r){for(var e=n.length,u=r?e:-1;r?u--:++u<e;)if(t(n[u],u,n))return u;return-1}function r(n,t,r){if(t!==t)return s(n,r);r-=1;for(var e=n.length;++r<e;)if(n[r]===t)return r;return-1}function e(n){return typeof n=="function"||false}function u(n){return typeof n=="string"?n:null==n?"":n+""}function i(n,t){for(var r=-1,e=n.length;++r<e&&-1<t.indexOf(n.charAt(r)););
return r}function o(n,t){for(var r=n.length;r--&&-1<t.indexOf(n.charAt(r)););return r}function f(t,r){return n(t.a,r.a)||t.b-r.b}function l(n){return Nn[n]}function a(n){return Ln[n]}function c(n){return"\\"+Mn[n]}function s(n,t,r){var e=n.length;for(t+=r?0:-1;r?t--:++t<e;){var u=n[t];if(u!==u)return t}return-1}function p(n){return!!n&&typeof n=="object"}function h(n){return 160>=n&&9<=n&&13>=n||32==n||160==n||5760==n||6158==n||8192<=n&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n);
}function _(n,t){for(var r=-1,e=n.length,u=-1,i=[];++r<e;)n[r]===t&&(n[r]=L,i[++u]=r);return i}function v(n){for(var t=-1,r=n.length;++t<r&&h(n.charCodeAt(t)););return t}function g(n){for(var t=n.length;t--&&h(n.charCodeAt(t)););return t}function y(n){return zn[n]}function d(h){function Nn(n){if(p(n)&&!(Ti(n)||n instanceof Bn)){if(n instanceof zn)return n;if(ru.call(n,"__chain__")&&ru.call(n,"__wrapped__"))return Mr(n)}return new zn(n)}function Ln(){}function zn(n,t,r){this.__wrapped__=n,this.__actions__=r||[],
this.__chain__=!!t}function Bn(n){this.__wrapped__=n,this.__actions__=null,this.__dir__=1,this.__filtered__=false,this.__iteratees__=null,this.__takeCount__=Su,this.__views__=null}function Mn(){this.__data__={}}function Pn(n){var t=n?n.length:0;for(this.data={hash:bu(null),set:new vu};t--;)this.push(n[t])}function qn(n,t){var r=n.data;return(typeof t=="string"||ve(t)?r.set.has(t):r.hash[t])?0:-1}function Dn(n,t){var r=-1,e=n.length;for(t||(t=Me(e));++r<e;)t[r]=n[r];return t}function Kn(n,t){for(var r=-1,e=n.length;++r<e&&false!==t(n[r],r,n););
return n}function Vn(n,t){for(var r=-1,e=n.length;++r<e;)if(!t(n[r],r,n))return false;return true}function Gn(n,t){for(var r=-1,e=n.length,u=-1,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[++u]=o)}return i}function Jn(n,t){for(var r=-1,e=n.length,u=Me(e);++r<e;)u[r]=t(n[r],r,n);return u}function Xn(n,t,r,e){var u=-1,i=n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function Hn(n,t){for(var r=-1,e=n.length;++r<e;)if(t(n[r],r,n))return true;return false}function Qn(n,t){return n===m?t:n}function nt(n,t,r,e){
return n!==m&&ru.call(e,r)?n:t}function tt(n,t,r){for(var e=-1,u=Ki(t),i=u.length;++e<i;){var o=u[e],f=n[o],l=r(f,t[o],o,n,t);(l===l?l===f:f!==f)&&(f!==m||o in n)||(n[o]=l)}return n}function rt(n,t){return null==t?n:ut(t,Ki(t),n)}function et(n,t){for(var r=-1,e=null==n,u=!e&&Ir(n),i=u?n.length:0,o=t.length,f=Me(o);++r<o;){var l=t[r];f[r]=u?Er(l,i)?n[l]:m:e?m:n[l]}return f}function ut(n,t,r){r||(r={});for(var e=-1,u=t.length;++e<u;){var i=t[e];r[i]=n[i]}return r}function it(n,t,r){var e=typeof n;return"function"==e?t===m?n:Mt(n,t,r):null==n?Fe:"object"==e?xt(n):t===m?Be(n):At(n,t);
}function ot(n,t,r,e,u,i,o){var f;if(r&&(f=u?r(n,e,u):r(n)),f!==m)return f;if(!ve(n))return n;if(e=Ti(n)){if(f=jr(n),!t)return Dn(n,f)}else{var l=uu.call(n),a=l==D;if(l!=V&&l!=z&&(!a||u))return $n[l]?Or(n,l,t):u?n:{};if(f=kr(a?{}:n),!t)return rt(f,n)}for(i||(i=[]),o||(o=[]),u=i.length;u--;)if(i[u]==n)return o[u];return i.push(n),o.push(f),(e?Kn:vt)(n,function(e,u){f[u]=ot(e,t,r,u,n,i,o)}),f}function ft(n,t,r){if(typeof n!="function")throw new Je(N);return gu(function(){n.apply(m,r)},t)}function lt(n,t){
var e=n?n.length:0,u=[];if(!e)return u;var i=-1,o=br(),f=o==r,l=f&&200<=t.length?Vu(t):null,a=t.length;l&&(o=qn,f=false,t=l);n:for(;++i<e;)if(l=n[i],f&&l===l){for(var c=a;c--;)if(t[c]===l)continue n;u.push(l)}else 0>o(t,l,0)&&u.push(l);return u}function at(n,t){var r=true;return Mu(n,function(n,e,u){return r=!!t(n,e,u)}),r}function ct(n,t,r,e){var u=e,i=u;return Mu(n,function(n,o,f){o=+t(n,o,f),(r(o,u)||o===e&&o===i)&&(u=o,i=n)}),i}function st(n,t){var r=[];return Mu(n,function(n,e,u){t(n,e,u)&&r.push(n);
}),r}function pt(n,t,r,e){var u;return r(n,function(n,r,i){return t(n,r,i)?(u=e?r:n,false):void 0}),u}function ht(n,t,r){for(var e=-1,u=n.length,i=-1,o=[];++e<u;){var f=n[e];if(p(f)&&Ir(f)&&(r||Ti(f)||se(f))){t&&(f=ht(f,t,r));for(var l=-1,a=f.length;++l<a;)o[++i]=f[l]}else r||(o[++i]=f)}return o}function _t(n,t){qu(n,t,ke)}function vt(n,t){return qu(n,t,Ki)}function gt(n,t){return Du(n,t,Ki)}function yt(n,t){for(var r=-1,e=t.length,u=-1,i=[];++r<e;){var o=t[r];$i(n[o])&&(i[++u]=o)}return i}function dt(n,t,r){
if(null!=n){r!==m&&r in zr(n)&&(t=[r]),r=0;for(var e=t.length;null!=n&&r<e;)n=n[t[r++]];return r&&r==e?n:m}}function mt(n,t,r,e,u,i){if(n===t)n=true;else if(null==n||null==t||!ve(n)&&!p(t))n=n!==n&&t!==t;else n:{var o=mt,f=Ti(n),l=Ti(t),a=B,c=B;f||(a=uu.call(n),a==z?a=V:a!=V&&(f=we(n))),l||(c=uu.call(t),c==z?c=V:c!=V&&we(t));var s=a==V,l=c==V,c=a==c;if(!c||f||s){if(!e&&(a=s&&ru.call(n,"__wrapped__"),l=l&&ru.call(t,"__wrapped__"),a||l)){n=o(a?n.value():n,l?t.value():t,r,e,u,i);break n}if(c){for(u||(u=[]),
i||(i=[]),a=u.length;a--;)if(u[a]==n){n=i[a]==t;break n}u.push(n),i.push(t),n=(f?gr:dr)(n,t,o,r,e,u,i),u.pop(),i.pop()}else n=false}else n=yr(n,t,a)}return n}function wt(n,t,r){var e=t.length,u=e,i=!r;if(null==n)return!u;for(n=zr(n);e--;){var o=t[e];if(i&&o[2]?o[1]!==n[o[0]]:!(o[0]in n))return false}for(;++e<u;){var o=t[e],f=o[0],l=n[f],a=o[1];if(i&&o[2]){if(l===m&&!(f in n))return false}else if(o=r?r(l,a,f):m,o===m?!mt(a,l,r,true):!o)return false}return true}function bt(n,t){var r=-1,e=Ir(n)?Me(n.length):[];return Mu(n,function(n,u,i){
e[++r]=t(n,u,i)}),e}function xt(n){var t=xr(n);if(1==t.length&&t[0][2]){var r=t[0][0],e=t[0][1];return function(n){return null==n?false:n[r]===e&&(e!==m||r in zr(n))}}return function(n){return wt(n,t)}}function At(n,t){var r=Ti(n),e=Wr(n)&&t===t&&!ve(t),u=n+"";return n=Br(n),function(i){if(null==i)return false;var o=u;if(i=zr(i),!(!r&&e||o in i)){if(i=1==n.length?i:dt(i,Ct(n,0,-1)),null==i)return false;o=Vr(n),i=zr(i)}return i[o]===t?t!==m||o in i:mt(t,i[o],m,true)}}function jt(n,t,r,e,u){if(!ve(n))return n;var i=Ir(t)&&(Ti(t)||we(t)),o=i?null:Ki(t);
return Kn(o||t,function(f,l){if(o&&(l=f,f=t[l]),p(f)){e||(e=[]),u||(u=[]);n:{for(var a=l,c=e,s=u,h=c.length,_=t[a];h--;)if(c[h]==_){n[a]=s[h];break n}var h=n[a],v=r?r(h,_,a,n,t):m,g=v===m;g&&(v=_,Ir(_)&&(Ti(_)||we(_))?v=Ti(h)?h:Ir(h)?Dn(h):[]:Fi(_)||se(_)?v=se(h)?Ae(h):Fi(h)?h:{}:g=false),c.push(_),s.push(v),g?n[a]=jt(v,_,r,c,s):(v===v?v!==h:h===h)&&(n[a]=v)}}else a=n[l],c=r?r(a,f,l,n,t):m,(s=c===m)&&(c=f),c===m&&(!i||l in n)||!s&&(c===c?c===a:a!==a)||(n[l]=c)}),n}function kt(n){return function(t){return null==t?m:t[n];
}}function Ot(n){var t=n+"";return n=Br(n),function(r){return dt(r,n,t)}}function Rt(n,t){for(var r=n?t.length:0;r--;){var e=t[r];if(e!=u&&Er(e)){var u=e;yu.call(n,e,1)}}}function It(n,t){return n+su(Cu()*(t-n+1))}function Et(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=false,n):t(r,n,u,i)}),r}function Ct(n,t,r){var e=-1,u=n.length;for(t=null==t?0:+t||0,0>t&&(t=-t>u?0:u+t),r=r===m||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Me(u);++e<u;)r[e]=n[e+t];return r}function Wt(n,t){var r;return Mu(n,function(n,e,u){
return r=t(n,e,u),!r}),!!r}function St(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;return n}function Tt(t,r,e){var u=mr(),i=-1;return r=Jn(r,function(n){return u(n)}),t=bt(t,function(n){return{a:Jn(r,function(t){return t(n)}),b:++i,c:n}}),St(t,function(t,r){var u;n:{u=-1;for(var i=t.a,o=r.a,f=i.length,l=e.length;++u<f;){var a=n(i[u],o[u]);if(a){u=u<l?a*(e[u]?1:-1):a;break n}}u=t.b-r.b}return u})}function Ut(n,t){var r=0;return Mu(n,function(n,e,u){r+=+t(n,e,u)||0}),r}function $t(n,t){var e=-1,u=br(),i=n.length,o=u==r,f=o&&200<=i,l=f?Vu():null,a=[];
l?(u=qn,o=false):(f=false,l=t?[]:a);n:for(;++e<i;){var c=n[e],s=t?t(c,e,n):c;if(o&&c===c){for(var p=l.length;p--;)if(l[p]===s)continue n;t&&l.push(s),a.push(c)}else 0>u(l,s,0)&&((t||f)&&l.push(s),a.push(c))}return a}function Ft(n,t){for(var r=-1,e=t.length,u=Me(e);++r<e;)u[r]=n[t[r]];return u}function Nt(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?Ct(n,e?0:i,e?i+1:u):Ct(n,e?i+1:0,e?u:i)}function Lt(n,t){var r=n;r instanceof Bn&&(r=r.value());for(var e=-1,u=t.length;++e<u;){
var r=[r],i=t[e];_u.apply(r,i.args),r=i.func.apply(i.thisArg,r)}return r}function zt(n,t,r){var e=0,u=n?n.length:e;if(typeof t=="number"&&t===t&&u<=Uu){for(;e<u;){var i=e+u>>>1,o=n[i];(r?o<=t:o<t)&&null!==o?e=i+1:u=i}return u}return Bt(n,t,Fe,r)}function Bt(n,t,r,e){t=r(t);for(var u=0,i=n?n.length:0,o=t!==t,f=null===t,l=t===m;u<i;){var a=su((u+i)/2),c=r(n[a]),s=c!==m,p=c===c;(o?p||e:f?p&&s&&(e||null!=c):l?p&&(e||s):null==c?0:e?c<=t:c<t)?u=a+1:i=a}return Ou(i,Tu)}function Mt(n,t,r){if(typeof n!="function")return Fe;
if(t===m)return n;switch(r){case 1:return function(r){return n.call(t,r)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)};case 5:return function(r,e,u,i,o){return n.call(t,r,e,u,i,o)}}return function(){return n.apply(t,arguments)}}function Pt(n){return lu.call(n,0)}function qt(n,t,r){for(var e=r.length,u=-1,i=ku(n.length-e,0),o=-1,f=t.length,l=Me(i+f);++o<f;)l[o]=t[o];for(;++u<e;)l[r[u]]=n[u];for(;i--;)l[o++]=n[u++];return l}function Dt(n,t,r){
for(var e=-1,u=r.length,i=-1,o=ku(n.length-u,0),f=-1,l=t.length,a=Me(o+l);++i<o;)a[i]=n[i];for(o=i;++f<l;)a[o+f]=t[f];for(;++e<u;)a[o+r[e]]=n[i++];return a}function Kt(n,t){return function(r,e,u){var i=t?t():{};if(e=mr(e,u,3),Ti(r)){u=-1;for(var o=r.length;++u<o;){var f=r[u];n(i,f,e(f,u,r),r)}}else Mu(r,function(t,r,u){n(i,t,e(t,r,u),u)});return i}}function Vt(n){return ae(function(t,r){var e=-1,u=null==t?0:r.length,i=2<u?r[u-2]:m,o=2<u?r[2]:m,f=1<u?r[u-1]:m;for(typeof i=="function"?(i=Mt(i,f,5),
u-=2):(i=typeof f=="function"?f:m,u-=i?1:0),o&&Cr(r[0],r[1],o)&&(i=3>u?m:i,u=1);++e<u;)(o=r[e])&&n(t,o,i);return t})}function Yt(n,t){return function(r,e){var u=r?Zu(r):0;if(!Tr(u))return n(r,e);for(var i=t?u:-1,o=zr(r);(t?i--:++i<u)&&false!==e(o[i],i,o););return r}}function Zt(n){return function(t,r,e){var u=zr(t);e=e(t);for(var i=e.length,o=n?i:-1;n?o--:++o<i;){var f=e[o];if(false===r(u[f],f,u))break}return t}}function Gt(n,t){function r(){return(this&&this!==Yn&&this instanceof r?e:n).apply(t,arguments);
}var e=Xt(n);return r}function Jt(n){return function(t){var r=-1;t=Te(Ie(t));for(var e=t.length,u="";++r<e;)u=n(u,t[r],r);return u}}function Xt(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4])}var r=Bu(n.prototype),t=n.apply(r,t);return ve(t)?t:r}}function Ht(n){function t(r,e,u){return u&&Cr(r,e,u)&&(e=null),
r=vr(r,n,null,null,null,null,null,e),r.placeholder=t.placeholder,r}return t}function Qt(n,t){return function(r,e,u){if(u&&Cr(r,e,u)&&(e=null),e=mr(e,u,3),1==e.length){u=r=Lr(r);for(var i=e,o=-1,f=u.length,l=t,a=l;++o<f;){var c=u[o],s=+i(c);n(s,l)&&(l=s,a=c)}if(u=a,!r.length||u!==t)return u}return ct(r,e,n,t)}}function nr(n,r){return function(e,u,i){return u=mr(u,i,3),Ti(e)?(u=t(e,u,r),-1<u?e[u]:m):pt(e,u,n)}}function tr(n){return function(r,e,u){return r&&r.length?(e=mr(e,u,3),t(r,e,n)):-1}}function rr(n){
return function(t,r,e){return r=mr(r,e,3),pt(t,r,n,true)}}function er(n){return function(){for(var t,r=arguments.length,e=n?r:-1,u=0,i=Me(r);n?e--:++e<r;){var o=i[u++]=arguments[e];if(typeof o!="function")throw new Je(N);!t&&zn.prototype.thru&&"wrapper"==wr(o)&&(t=new zn([]))}for(e=t?-1:r;++e<r;){var o=i[e],u=wr(o),f="wrapper"==u?Yu(o):null;t=f&&Sr(f[0])&&f[1]==(I|j|O|E)&&!f[4].length&&1==f[9]?t[wr(f[0])].apply(t,f[3]):1==o.length&&Sr(o)?t[u]():t.thru(o)}return function(){var n=arguments;if(t&&1==n.length&&Ti(n[0]))return t.plant(n[0]).value();
for(var e=0,n=r?i[e].apply(this,n):n[0];++e<r;)n=i[e].call(this,n);return n}}}function ur(n,t){return function(r,e,u){return typeof e=="function"&&u===m&&Ti(r)?n(r,e):t(r,Mt(e,u,3))}}function ir(n){return function(t,r,e){return(typeof r!="function"||e!==m)&&(r=Mt(r,e,3)),n(t,r,ke)}}function or(n){return function(t,r,e){return(typeof r!="function"||e!==m)&&(r=Mt(r,e,3)),n(t,r)}}function fr(n){return function(t,r,e){var u={};return r=mr(r,e,3),vt(t,function(t,e,i){i=r(t,e,i),e=n?i:e,t=n?t:i,u[e]=t}),
u}}function lr(n){return function(t,r,e){return t=u(t),(n?t:"")+pr(t,r,e)+(n?"":t)}}function ar(n){var t=ae(function(r,e){var u=_(e,t.placeholder);return vr(r,n,null,e,u)});return t}function cr(n,t){return function(r,e,u,i){var o=3>arguments.length;return typeof e=="function"&&i===m&&Ti(r)?n(r,e,u,o):Et(r,mr(e,i,4),u,o,t)}}function sr(n,t,r,e,u,i,o,f,l,a){function c(){for(var w=arguments.length,A=w,j=Me(w);A--;)j[A]=arguments[A];if(e&&(j=qt(j,e,u)),i&&(j=Dt(j,i,o)),v||y){var A=c.placeholder,k=_(j,A),w=w-k.length;
if(w<a){var I=f?Dn(f):null,w=ku(a-w,0),E=v?k:null,k=v?null:k,C=v?j:null,j=v?null:j;return t|=v?O:R,t&=~(v?R:O),g||(t&=~(b|x)),j=[n,t,r,C,E,j,k,I,l,w],I=sr.apply(m,j),Sr(n)&&Gu(I,j),I.placeholder=A,I}}if(A=p?r:this,I=h?A[n]:n,f)for(w=j.length,E=Ou(f.length,w),k=Dn(j);E--;)C=f[E],j[E]=Er(C,w)?k[C]:m;return s&&l<j.length&&(j.length=l),this&&this!==Yn&&this instanceof c&&(I=d||Xt(n)),I.apply(A,j)}var s=t&I,p=t&b,h=t&x,v=t&j,g=t&A,y=t&k,d=h?null:Xt(n);return c}function pr(n,t,r){return n=n.length,t=+t,
n<t&&Au(t)?(t-=n,r=null==r?" ":r+"",We(r,au(t/r.length)).slice(0,t)):""}function hr(n,t,r,e){function u(){for(var t=-1,f=arguments.length,l=-1,a=e.length,c=Me(f+a);++l<a;)c[l]=e[l];for(;f--;)c[l++]=arguments[++t];return(this&&this!==Yn&&this instanceof u?o:n).apply(i?r:this,c)}var i=t&b,o=Xt(n);return u}function _r(n){return function(t,r,e,u){var i=mr(e);return null==e&&i===it?zt(t,r,n):Bt(t,r,i(e,u,1),n)}}function vr(n,t,r,e,u,i,o,f){var l=t&x;if(!l&&typeof n!="function")throw new Je(N);var a=e?e.length:0;
if(a||(t&=~(O|R),e=u=null),a-=u?u.length:0,t&R){var c=e,s=u;e=u=null}var p=l?null:Yu(n);return r=[n,t,r,e,u,c,s,i,o,f],p&&(e=r[1],t=p[1],f=e|t,u=t==I&&e==j||t==I&&e==E&&r[7].length<=p[8]||t==(I|E)&&e==j,(f<I||u)&&(t&b&&(r[2]=p[2],f|=e&b?0:A),(e=p[3])&&(u=r[3],r[3]=u?qt(u,e,p[4]):Dn(e),r[4]=u?_(r[3],L):Dn(p[4])),(e=p[5])&&(u=r[5],r[5]=u?Dt(u,e,p[6]):Dn(e),r[6]=u?_(r[5],L):Dn(p[6])),(e=p[7])&&(r[7]=Dn(e)),t&I&&(r[8]=null==r[8]?p[8]:Ou(r[8],p[8])),null==r[9]&&(r[9]=p[9]),r[0]=p[0],r[1]=f),t=r[1],f=r[9]),
r[9]=null==f?l?0:n.length:ku(f-a,0)||0,(p?Ku:Gu)(t==b?Gt(r[0],r[2]):t!=O&&t!=(b|O)||r[4].length?sr.apply(m,r):hr.apply(m,r),r)}function gr(n,t,r,e,u,i,o){var f=-1,l=n.length,a=t.length;if(l!=a&&(!u||a<=l))return false;for(;++f<l;){var c=n[f],a=t[f],s=e?e(u?a:c,u?c:a,f):m;if(s!==m){if(s)continue;return false}if(u){if(!Hn(t,function(n){return c===n||r(c,n,e,u,i,o)}))return false}else if(c!==a&&!r(c,a,e,u,i,o))return false}return true}function yr(n,t,r){switch(r){case M:case P:return+n==+t;case q:return n.name==t.name&&n.message==t.message;
case K:return n!=+n?t!=+t:n==+t;case Y:case Z:return n==t+""}return false}function dr(n,t,r,e,u,i,o){var f=Ki(n),l=f.length,a=Ki(t).length;if(l!=a&&!u)return false;for(a=l;a--;){var c=f[a];if(!(u?c in t:ru.call(t,c)))return false}for(var s=u;++a<l;){var c=f[a],p=n[c],h=t[c],_=e?e(u?h:p,u?p:h,c):m;if(_===m?!r(p,h,e,u,i,o):!_)return false;s||(s="constructor"==c)}return s||(r=n.constructor,e=t.constructor,!(r!=e&&"constructor"in n&&"constructor"in t)||typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)?true:false;
}function mr(n,t,r){var e=Nn.callback||Ue,e=e===Ue?it:e;return r?e(n,t,r):e}function wr(n){for(var t=n.name,r=Lu[t],e=r?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function br(n,t,e){var u=Nn.indexOf||Kr,u=u===Kr?r:u;return n?u(n,t,e):u}function xr(n){n=Oe(n);for(var t=n.length;t--;){var r=n[t][1];n[t][2]=r===r&&!ve(r)}return n}function Ar(n,t){var r=null==n?m:n[t];return ge(r)?r:m}function jr(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&ru.call(n,"index")&&(r.index=n.index,
r.input=n.input),r}function kr(n){return n=n.constructor,typeof n=="function"&&n instanceof n||(n=Ye),new n}function Or(n,t,r){var e=n.constructor;switch(t){case G:return Pt(n);case M:case P:return new e(+n);case J:case X:case H:case Q:case nn:case tn:case rn:case en:case un:return t=n.buffer,new e(r?Pt(t):t,n.byteOffset,n.length);case K:case Z:return new e(n);case Y:var u=new e(n.source,jn.exec(n));u.lastIndex=n.lastIndex}return u}function Rr(n,t,r){return null==n||Wr(t,n)||(t=Br(t),n=1==t.length?n:dt(n,Ct(t,0,-1)),
t=Vr(t)),t=null==n?n:n[t],null==t?m:t.apply(n,r)}function Ir(n){return null!=n&&Tr(Zu(n))}function Er(n,t){return n=typeof n=="number"||Rn.test(n)?+n:-1,t=null==t?Fu:t,-1<n&&0==n%1&&n<t}function Cr(n,t,r){if(!ve(r))return false;var e=typeof t;return("number"==e?Ir(r)&&Er(t,r.length):"string"==e&&t in r)?(t=r[t],n===n?n===t:t!==t):false}function Wr(n,t){var r=typeof n;return"string"==r&&yn.test(n)||"number"==r?true:Ti(n)?false:!gn.test(n)||null!=t&&n in zr(t)}function Sr(n){var t=wr(n);return t in Bn.prototype?(t=Nn[t],
n===t?true:(t=Yu(t),!!t&&n===t[0])):false}function Tr(n){return typeof n=="number"&&-1<n&&0==n%1&&n<=Fu}function Ur(n,t){n=zr(n);for(var r=-1,e=t.length,u={};++r<e;){var i=t[r];i in n&&(u[i]=n[i])}return u}function $r(n,t){var r={};return _t(n,function(n,e,u){t(n,e,u)&&(r[e]=n)}),r}function Fr(n){var t;if(!p(n)||uu.call(n)!=V||!(ru.call(n,"constructor")||(t=n.constructor,typeof t!="function"||t instanceof t)))return false;var r;return _t(n,function(n,t){r=t}),r===m||ru.call(n,r)}function Nr(n){for(var t=ke(n),r=t.length,e=r&&n.length,u=!!e&&Tr(e)&&(Ti(n)||se(n)),i=-1,o=[];++i<r;){
var f=t[i];(u&&Er(f,e)||ru.call(n,f))&&o.push(f)}return o}function Lr(n){return null==n?[]:Ir(n)?ve(n)?n:Ye(n):Re(n)}function zr(n){return ve(n)?n:Ye(n)}function Br(n){if(Ti(n))return n;var t=[];return u(n).replace(dn,function(n,r,e,u){t.push(e?u.replace(xn,"$1"):r||n)}),t}function Mr(n){return n instanceof Bn?n.clone():new zn(n.__wrapped__,n.__chain__,Dn(n.__actions__))}function Pr(n,t,r){return n&&n.length?((r?Cr(n,t,r):null==t)&&(t=1),Ct(n,0>t?0:t)):[]}function qr(n,t,r){var e=n?n.length:0;return e?((r?Cr(n,t,r):null==t)&&(t=1),
t=e-(+t||0),Ct(n,0,0>t?0:t)):[]}function Dr(n){return n?n[0]:m}function Kr(n,t,e){var u=n?n.length:0;if(!u)return-1;if(typeof e=="number")e=0>e?ku(u+e,0):e;else if(e)return e=zt(n,t),n=n[e],(t===t?t===n:n!==n)?e:-1;return r(n,t,e||0)}function Vr(n){var t=n?n.length:0;return t?n[t-1]:m}function Yr(n){return Pr(n,1)}function Zr(n,t,e,u){if(!n||!n.length)return[];null!=t&&typeof t!="boolean"&&(u=e,e=Cr(n,t,u)?null:t,t=false);var i=mr();if((null!=e||i!==it)&&(e=i(e,u,3)),t&&br()==r){t=e;var o;e=-1,u=n.length;
for(var i=-1,f=[];++e<u;){var l=n[e],a=t?t(l,e,n):l;e&&o===a||(o=a,f[++i]=l)}n=f}else n=$t(n,e);return n}function Gr(n){if(!n||!n.length)return[];var t=-1,r=0;n=Gn(n,function(n){return Ir(n)?(r=ku(n.length,r),true):void 0});for(var e=Me(r);++t<r;)e[t]=Jn(n,kt(t));return e}function Jr(n,t,r){return n&&n.length?(n=Gr(n),null==t?n:(t=Mt(t,r,4),Jn(n,function(n){return Xn(n,t,m,true)}))):[]}function Xr(n,t){var r=-1,e=n?n.length:0,u={};for(!e||t||Ti(n[0])||(t=[]);++r<e;){var i=n[r];t?u[i]=t[r]:i&&(u[i[0]]=i[1]);
}return u}function Hr(n){return n=Nn(n),n.__chain__=true,n}function Qr(n,t,r){return t.call(r,n)}function ne(n,t,r){var e=Ti(n)?Vn:at;return r&&Cr(n,t,r)&&(t=null),(typeof t!="function"||r!==m)&&(t=mr(t,r,3)),e(n,t)}function te(n,t,r){var e=Ti(n)?Gn:st;return t=mr(t,r,3),e(n,t)}function re(n,t,r,e){var u=n?Zu(n):0;return Tr(u)||(n=Re(n),u=n.length),u?(r=typeof r!="number"||e&&Cr(t,r,e)?0:0>r?ku(u+r,0):r||0,typeof n=="string"||!Ti(n)&&me(n)?r<u&&-1<n.indexOf(t,r):-1<br(n,t,r)):false}function ee(n,t,r){
var e=Ti(n)?Jn:bt;return t=mr(t,r,3),e(n,t)}function ue(n,t,r){if(r?Cr(n,t,r):null==t){n=Lr(n);var e=n.length;return 0<e?n[It(0,e-1)]:m}r=-1,n=xe(n);var e=n.length,u=e-1;for(t=Ou(0>t?0:+t||0,e);++r<t;){var e=It(r,u),i=n[e];n[e]=n[r],n[r]=i}return n.length=t,n}function ie(n,t,r){var e=Ti(n)?Hn:Wt;return r&&Cr(n,t,r)&&(t=null),(typeof t!="function"||r!==m)&&(t=mr(t,r,3)),e(n,t)}function oe(n,t){var r;if(typeof t!="function"){if(typeof n!="function")throw new Je(N);var e=n;n=t,t=e}return function(){
return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}}function fe(n,t,r){function e(){var r=t-(wi()-a);0>=r||r>t?(f&&cu(f),r=p,f=s=p=m,r&&(h=wi(),l=n.apply(c,o),s||f||(o=c=null))):s=gu(e,r)}function u(){s&&cu(s),f=s=p=m,(v||_!==t)&&(h=wi(),l=n.apply(c,o),s||f||(o=c=null))}function i(){if(o=arguments,a=wi(),c=this,p=v&&(s||!g),false===_)var r=g&&!s;else{f||g||(h=a);var i=_-(a-h),y=0>=i||i>_;y?(f&&(f=cu(f)),h=a,l=n.apply(c,o)):f||(f=gu(u,i))}return y&&s?s=cu(s):s||t===_||(s=gu(e,t)),r&&(y=true,l=n.apply(c,o)),
!y||s||f||(o=c=null),l}var o,f,l,a,c,s,p,h=0,_=false,v=true;if(typeof n!="function")throw new Je(N);if(t=0>t?0:+t||0,true===r)var g=true,v=false;else ve(r)&&(g=r.leading,_="maxWait"in r&&ku(+r.maxWait||0,t),v="trailing"in r?r.trailing:v);return i.cancel=function(){s&&cu(s),f&&cu(f),f=s=p=m},i}function le(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e),r.cache=i.set(u,e),e)}if(typeof n!="function"||t&&typeof t!="function")throw new Je(N);return r.cache=new le.Cache,
r}function ae(n,t){if(typeof n!="function")throw new Je(N);return t=ku(t===m?n.length-1:+t||0,0),function(){for(var r=arguments,e=-1,u=ku(r.length-t,0),i=Me(u);++e<u;)i[e]=r[t+e];switch(t){case 0:return n.call(this,i);case 1:return n.call(this,r[0],i);case 2:return n.call(this,r[0],r[1],i)}for(u=Me(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=i,n.apply(this,u)}}function ce(n,t){return n>t}function se(n){return p(n)&&Ir(n)&&uu.call(n)==z}function pe(n){return!!n&&1===n.nodeType&&p(n)&&-1<uu.call(n).indexOf("Element");
}function he(n,t,r,e){return e=(r=typeof r=="function"?Mt(r,e,3):m)?r(n,t):m,e===m?mt(n,t,r):!!e}function _e(n){return p(n)&&typeof n.message=="string"&&uu.call(n)==q}function ve(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function ge(n){return null==n?false:uu.call(n)==D?ou.test(tu.call(n)):p(n)&&On.test(n)}function ye(n){return typeof n=="number"||p(n)&&uu.call(n)==K}function de(n){return p(n)&&uu.call(n)==Y}function me(n){return typeof n=="string"||p(n)&&uu.call(n)==Z}function we(n){return p(n)&&Tr(n.length)&&!!Un[uu.call(n)];
}function be(n,t){return n<t}function xe(n){var t=n?Zu(n):0;return Tr(t)?t?Dn(n):[]:Re(n)}function Ae(n){return ut(n,ke(n))}function je(n){return yt(n,ke(n))}function ke(n){if(null==n)return[];ve(n)||(n=Ye(n));for(var t=n.length,t=t&&Tr(t)&&(Ti(n)||se(n))&&t||0,r=n.constructor,e=-1,r=typeof r=="function"&&r.prototype===n,u=Me(t),i=0<t;++e<t;)u[e]=e+"";for(var o in n)i&&Er(o,t)||"constructor"==o&&(r||!ru.call(n,o))||u.push(o);return u}function Oe(n){n=zr(n);for(var t=-1,r=Ki(n),e=r.length,u=Me(e);++t<e;){
var i=r[t];u[t]=[i,n[i]]}return u}function Re(n){return Ft(n,Ki(n))}function Ie(n){return(n=u(n))&&n.replace(In,l).replace(bn,"")}function Ee(n){return(n=u(n))&&wn.test(n)?n.replace(mn,"\\$&"):n}function Ce(n,t,r){return r&&Cr(n,t,r)&&(t=0),Eu(n,t)}function We(n,t){var r="";if(n=u(n),t=+t,1>t||!n||!Au(t))return r;do t%2&&(r+=n),t=su(t/2),n+=n;while(t);return r}function Se(n,t,r){var e=n;return(n=u(n))?(r?Cr(e,t,r):null==t)?n.slice(v(n),g(n)+1):(t+="",n.slice(i(n,t),o(n,t)+1)):n}function Te(n,t,r){
return r&&Cr(n,t,r)&&(t=null),n=u(n),n.match(t||Wn)||[]}function Ue(n,t,r){return r&&Cr(n,t,r)&&(t=null),p(n)?Ne(n):it(n,t)}function $e(n){return function(){return n}}function Fe(n){return n}function Ne(n){return xt(ot(n,true))}function Le(n,t,r){if(null==r){var e=ve(t),u=e?Ki(t):null;((u=u&&u.length?yt(t,u):null)?u.length:e)||(u=false,r=t,t=n,n=this)}u||(u=yt(t,Ki(t)));var i=true,e=-1,o=$i(n),f=u.length;false===r?i=false:ve(r)&&"chain"in r&&(i=r.chain);for(;++e<f;){r=u[e];var l=t[r];n[r]=l,o&&(n.prototype[r]=function(t){
return function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=Dn(this.__actions__)).push({func:t,args:arguments,thisArg:n}),e.__chain__=r,e}return r=[this.value()],_u.apply(r,arguments),t.apply(n,r)}}(l))}return n}function ze(){}function Be(n){return Wr(n)?kt(n):Ot(n)}h=h?Zn.defaults(Yn.Object(),h,Zn.pick(Yn,Tn)):Yn;var Me=h.Array,Pe=h.Date,qe=h.Error,De=h.Function,Ke=h.Math,Ve=h.Number,Ye=h.Object,Ze=h.RegExp,Ge=h.String,Je=h.TypeError,Xe=Me.prototype,He=Ye.prototype,Qe=Ge.prototype,nu=(nu=h.window)?nu.document:null,tu=De.prototype.toString,ru=He.hasOwnProperty,eu=0,uu=He.toString,iu=h._,ou=Ze("^"+Ee(tu.call(ru)).replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),fu=Ar(h,"ArrayBuffer"),lu=Ar(fu&&new fu(0),"slice"),au=Ke.ceil,cu=h.clearTimeout,su=Ke.floor,pu=Ar(Ye,"getPrototypeOf"),hu=h.parseFloat,_u=Xe.push,vu=Ar(h,"Set"),gu=h.setTimeout,yu=Xe.splice,du=Ar(h,"Uint8Array"),mu=Ar(h,"WeakMap"),wu=function(){
try{var n=Ar(h,"Float64Array"),t=new n(new fu(10),0,1)&&n}catch(r){}return t||null}(),bu=Ar(Ye,"create"),xu=Ar(Me,"isArray"),Au=h.isFinite,ju=Ar(Ye,"keys"),ku=Ke.max,Ou=Ke.min,Ru=Ar(Pe,"now"),Iu=Ar(Ve,"isFinite"),Eu=h.parseInt,Cu=Ke.random,Wu=Ve.NEGATIVE_INFINITY,Su=Ve.POSITIVE_INFINITY,Tu=4294967294,Uu=2147483647,$u=wu?wu.BYTES_PER_ELEMENT:0,Fu=9007199254740991,Nu=mu&&new mu,Lu={},zu=Nn.support={};!function(n){function t(){this.x=n}var r=[];t.prototype={valueOf:n,y:n};for(var e in new t)r.push(e);
try{zu.dom=11===nu.createDocumentFragment().nodeType}catch(u){zu.dom=false}}(1,0),Nn.templateSettings={escape:hn,evaluate:_n,interpolate:vn,variable:"",imports:{_:Nn}};var Bu=function(){function n(){}return function(t){if(ve(t)){n.prototype=t;var r=new n;n.prototype=null}return r||{}}}(),Mu=Yt(vt),Pu=Yt(gt,true),qu=Zt(),Du=Zt(true),Ku=Nu?function(n,t){return Nu.set(n,t),n}:Fe;lu||(Pt=fu&&du?function(n){var t=n.byteLength,r=wu?su(t/$u):0,e=r*$u,u=new fu(t);if(r){var i=new wu(u,0,r);i.set(new wu(n,0,r))}return t!=e&&(i=new du(u,e),
i.set(new du(n,e))),u}:$e(null));var Vu=bu&&vu?function(n){return new Pn(n)}:$e(null),Yu=Nu?function(n){return Nu.get(n)}:ze,Zu=kt("length"),Gu=function(){var n=0,t=0;return function(r,e){var u=wi(),i=T-(u-t);if(t=u,0<i){if(++n>=S)return r}else n=0;return Ku(r,e)}}(),Ju=ae(function(n,t){return Ir(n)?lt(n,ht(t,false,true)):[]}),Xu=tr(),Hu=tr(true),Qu=ae(function(n){for(var t=n.length,e=t,u=Me(c),i=br(),o=i==r,f=[];e--;){var l=n[e]=Ir(l=n[e])?l:[];u[e]=o&&120<=l.length?Vu(e&&l):null}var o=n[0],a=-1,c=o?o.length:0,s=u[0];
n:for(;++a<c;)if(l=o[a],0>(s?qn(s,l):i(f,l,0))){for(e=t;--e;){var p=u[e];if(0>(p?qn(p,l):i(n[e],l,0)))continue n}s&&s.push(l),f.push(l)}return f}),ni=ae(function(t,r){r=ht(r);var e=et(t,r);return Rt(t,r.sort(n)),e}),ti=_r(),ri=_r(true),ei=ae(function(n){return $t(ht(n,false,true))}),ui=ae(function(n,t){return Ir(n)?lt(n,t):[]}),ii=ae(Gr),oi=ae(function(n){var t=n.length,r=2<t?n[t-2]:m,e=1<t?n[t-1]:m;return 2<t&&typeof r=="function"?t-=2:(r=1<t&&typeof e=="function"?(--t,e):m,e=m),n.length=t,Jr(n,r,e)}),fi=ae(function(n,t){
return et(n,ht(t))}),li=Kt(function(n,t,r){ru.call(n,r)?++n[r]:n[r]=1}),ai=nr(Mu),ci=nr(Pu,true),si=ur(Kn,Mu),pi=ur(function(n,t){for(var r=n.length;r--&&false!==t(n[r],r,n););return n},Pu),hi=Kt(function(n,t,r){ru.call(n,r)?n[r].push(t):n[r]=[t]}),_i=Kt(function(n,t,r){n[r]=t}),vi=ae(function(n,t,r){var e=-1,u=typeof t=="function",i=Wr(t),o=Ir(n)?Me(n.length):[];return Mu(n,function(n){var f=u?t:i&&null!=n?n[t]:null;o[++e]=f?f.apply(n,r):Rr(n,t,r)}),o}),gi=Kt(function(n,t,r){n[r?0:1].push(t)},function(){
return[[],[]]}),yi=cr(Xn,Mu),di=cr(function(n,t,r,e){var u=n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r},Pu),mi=ae(function(n,t){if(null==n)return[];var r=t[2];return r&&Cr(t[0],t[1],r)&&(t.length=1),Tt(n,ht(t),[])}),wi=Ru||function(){return(new Pe).getTime()},bi=ae(function(n,t,r){var e=b;if(r.length)var u=_(r,bi.placeholder),e=e|O;return vr(n,e,t,r,u)}),xi=ae(function(n,t){t=t.length?ht(t):je(n);for(var r=-1,e=t.length;++r<e;){var u=t[r];n[u]=vr(n[u],b,n)}return n}),Ai=ae(function(n,t,r){
var e=b|x;if(r.length)var u=_(r,Ai.placeholder),e=e|O;return vr(t,e,n,r,u)}),ji=Ht(j),ki=Ht(k),Oi=ae(function(n,t){return ft(n,1,t)}),Ri=ae(function(n,t,r){return ft(n,t,r)}),Ii=er(),Ei=er(true),Ci=ar(O),Wi=ar(R),Si=ae(function(n,t){return vr(n,E,null,null,null,ht(t))}),Ti=xu||function(n){return p(n)&&Tr(n.length)&&uu.call(n)==B};zu.dom||(pe=function(n){return!!n&&1===n.nodeType&&p(n)&&!Fi(n)});var Ui=Iu||function(n){return typeof n=="number"&&Au(n)},$i=e(/x/)||du&&!e(du)?function(n){return uu.call(n)==D;
}:e,Fi=pu?function(n){if(!n||uu.call(n)!=V)return false;var t=Ar(n,"valueOf"),r=t&&(r=pu(t))&&pu(r);return r?n==r||pu(n)==r:Fr(n)}:Fr,Ni=Vt(function(n,t,r){return r?tt(n,t,r):rt(n,t)}),Li=ae(function(n){var t=n[0];return null==t?t:(n.push(Qn),Ni.apply(m,n))}),zi=rr(vt),Bi=rr(gt),Mi=ir(qu),Pi=ir(Du),qi=or(vt),Di=or(gt),Ki=ju?function(n){var t=null==n?null:n.constructor;return typeof t=="function"&&t.prototype===n||typeof n!="function"&&Ir(n)?Nr(n):ve(n)?ju(n):[]}:Nr,Vi=fr(true),Yi=fr(),Zi=Vt(jt),Gi=ae(function(n,t){
if(null==n)return{};if("function"!=typeof t[0])return t=Jn(ht(t),Ge),Ur(n,lt(ke(n),t));var r=Mt(t[0],t[1],3);return $r(n,function(n,t,e){return!r(n,t,e)})}),Ji=ae(function(n,t){return null==n?{}:"function"==typeof t[0]?$r(n,Mt(t[0],t[1],3)):Ur(n,ht(t))}),Xi=Jt(function(n,t,r){return t=t.toLowerCase(),n+(r?t.charAt(0).toUpperCase()+t.slice(1):t)}),Hi=Jt(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Qi=lr(),no=lr(true);8!=Eu(Sn+"08")&&(Ce=function(n,t,r){return(r?Cr(n,t,r):null==t)?t=0:t&&(t=+t),
n=Se(n),Eu(n,t||(kn.test(n)?16:10))});var to=Jt(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),ro=Jt(function(n,t,r){return n+(r?" ":"")+(t.charAt(0).toUpperCase()+t.slice(1))}),eo=ae(function(n,t){try{return n.apply(m,t)}catch(r){return _e(r)?r:new qe(r)}}),uo=ae(function(n,t){return function(r){return Rr(r,n,t)}}),io=ae(function(n,t){return function(r){return Rr(n,r,t)}}),oo=Qt(ce,Wu),fo=Qt(be,Su);return Nn.prototype=Ln.prototype,zn.prototype=Bu(Ln.prototype),zn.prototype.constructor=zn,
Bn.prototype=Bu(Ln.prototype),Bn.prototype.constructor=Bn,Mn.prototype["delete"]=function(n){return this.has(n)&&delete this.__data__[n]},Mn.prototype.get=function(n){return"__proto__"==n?m:this.__data__[n]},Mn.prototype.has=function(n){return"__proto__"!=n&&ru.call(this.__data__,n)},Mn.prototype.set=function(n,t){return"__proto__"!=n&&(this.__data__[n]=t),this},Pn.prototype.push=function(n){var t=this.data;typeof n=="string"||ve(n)?t.set.add(n):t.hash[n]=true},le.Cache=Mn,Nn.after=function(n,t){if(typeof t!="function"){
if(typeof n!="function")throw new Je(N);var r=n;n=t,t=r}return n=Au(n=+n)?n:0,function(){return 1>--n?t.apply(this,arguments):void 0}},Nn.ary=function(n,t,r){return r&&Cr(n,t,r)&&(t=null),t=n&&null==t?n.length:ku(+t||0,0),vr(n,I,null,null,null,null,t)},Nn.assign=Ni,Nn.at=fi,Nn.before=oe,Nn.bind=bi,Nn.bindAll=xi,Nn.bindKey=Ai,Nn.callback=Ue,Nn.chain=Hr,Nn.chunk=function(n,t,r){t=(r?Cr(n,t,r):null==t)?1:ku(+t||1,1),r=0;for(var e=n?n.length:0,u=-1,i=Me(au(e/t));r<e;)i[++u]=Ct(n,r,r+=t);return i},Nn.compact=function(n){
for(var t=-1,r=n?n.length:0,e=-1,u=[];++t<r;){var i=n[t];i&&(u[++e]=i)}return u},Nn.constant=$e,Nn.countBy=li,Nn.create=function(n,t,r){var e=Bu(n);return r&&Cr(n,t,r)&&(t=null),t?rt(e,t):e},Nn.curry=ji,Nn.curryRight=ki,Nn.debounce=fe,Nn.defaults=Li,Nn.defer=Oi,Nn.delay=Ri,Nn.difference=Ju,Nn.drop=Pr,Nn.dropRight=qr,Nn.dropRightWhile=function(n,t,r){return n&&n.length?Nt(n,mr(t,r,3),true,true):[]},Nn.dropWhile=function(n,t,r){return n&&n.length?Nt(n,mr(t,r,3),true):[]},Nn.fill=function(n,t,r,e){var u=n?n.length:0;
if(!u)return[];for(r&&typeof r!="number"&&Cr(n,t,r)&&(r=0,e=u),u=n.length,r=null==r?0:+r||0,0>r&&(r=-r>u?0:u+r),e=e===m||e>u?u:+e||0,0>e&&(e+=u),u=r>e?0:e>>>0,r>>>=0;r<u;)n[r++]=t;return n},Nn.filter=te,Nn.flatten=function(n,t,r){var e=n?n.length:0;return r&&Cr(n,t,r)&&(t=false),e?ht(n,t):[]},Nn.flattenDeep=function(n){return n&&n.length?ht(n,true):[]},Nn.flow=Ii,Nn.flowRight=Ei,Nn.forEach=si,Nn.forEachRight=pi,Nn.forIn=Mi,Nn.forInRight=Pi,Nn.forOwn=qi,Nn.forOwnRight=Di,Nn.functions=je,Nn.groupBy=hi,Nn.indexBy=_i,
Nn.initial=function(n){return qr(n,1)},Nn.intersection=Qu,Nn.invert=function(n,t,r){r&&Cr(n,t,r)&&(t=null),r=-1;for(var e=Ki(n),u=e.length,i={};++r<u;){var o=e[r],f=n[o];t?ru.call(i,f)?i[f].push(o):i[f]=[o]:i[f]=o}return i},Nn.invoke=vi,Nn.keys=Ki,Nn.keysIn=ke,Nn.map=ee,Nn.mapKeys=Vi,Nn.mapValues=Yi,Nn.matches=Ne,Nn.matchesProperty=function(n,t){return At(n,ot(t,true))},Nn.memoize=le,Nn.merge=Zi,Nn.method=uo,Nn.methodOf=io,Nn.mixin=Le,Nn.negate=function(n){if(typeof n!="function")throw new Je(N);return function(){
return!n.apply(this,arguments)}},Nn.omit=Gi,Nn.once=function(n){return oe(2,n)},Nn.pairs=Oe,Nn.partial=Ci,Nn.partialRight=Wi,Nn.partition=gi,Nn.pick=Ji,Nn.pluck=function(n,t){return ee(n,Be(t))},Nn.property=Be,Nn.propertyOf=function(n){return function(t){return dt(n,Br(t),t+"")}},Nn.pull=function(){var n=arguments,t=n[0];if(!t||!t.length)return t;for(var r=0,e=br(),u=n.length;++r<u;)for(var i=0,o=n[r];-1<(i=e(t,o,i));)yu.call(t,i,1);return t},Nn.pullAt=ni,Nn.range=function(n,t,r){r&&Cr(n,t,r)&&(t=r=null),
n=+n||0,r=null==r?1:+r||0,null==t?(t=n,n=0):t=+t||0;var e=-1;t=ku(au((t-n)/(r||1)),0);for(var u=Me(t);++e<t;)u[e]=n,n+=r;return u},Nn.rearg=Si,Nn.reject=function(n,t,r){var e=Ti(n)?Gn:st;return t=mr(t,r,3),e(n,function(n,r,e){return!t(n,r,e)})},Nn.remove=function(n,t,r){var e=[];if(!n||!n.length)return e;var u=-1,i=[],o=n.length;for(t=mr(t,r,3);++u<o;)r=n[u],t(r,u,n)&&(e.push(r),i.push(u));return Rt(n,i),e},Nn.rest=Yr,Nn.restParam=ae,Nn.set=function(n,t,r){if(null==n)return n;var e=t+"";t=null!=n[e]||Wr(t,n)?[e]:Br(t);
for(var e=-1,u=t.length,i=u-1,o=n;null!=o&&++e<u;){var f=t[e];ve(o)&&(e==i?o[f]=r:null==o[f]&&(o[f]=Er(t[e+1])?[]:{})),o=o[f]}return n},Nn.shuffle=function(n){return ue(n,Su)},Nn.slice=function(n,t,r){var e=n?n.length:0;return e?(r&&typeof r!="number"&&Cr(n,t,r)&&(t=0,r=e),Ct(n,t,r)):[]},Nn.sortBy=function(n,t,r){if(null==n)return[];r&&Cr(n,t,r)&&(t=null);var e=-1;return t=mr(t,r,3),n=bt(n,function(n,r,u){return{a:t(n,r,u),b:++e,c:n}}),St(n,f)},Nn.sortByAll=mi,Nn.sortByOrder=function(n,t,r,e){return null==n?[]:(e&&Cr(t,r,e)&&(r=null),
Ti(t)||(t=null==t?[]:[t]),Ti(r)||(r=null==r?[]:[r]),Tt(n,t,r))},Nn.spread=function(n){if(typeof n!="function")throw new Je(N);return function(t){return n.apply(this,t)}},Nn.take=function(n,t,r){return n&&n.length?((r?Cr(n,t,r):null==t)&&(t=1),Ct(n,0,0>t?0:t)):[]},Nn.takeRight=function(n,t,r){var e=n?n.length:0;return e?((r?Cr(n,t,r):null==t)&&(t=1),t=e-(+t||0),Ct(n,0>t?0:t)):[]},Nn.takeRightWhile=function(n,t,r){return n&&n.length?Nt(n,mr(t,r,3),false,true):[]},Nn.takeWhile=function(n,t,r){return n&&n.length?Nt(n,mr(t,r,3)):[];
},Nn.tap=function(n,t,r){return t.call(r,n),n},Nn.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new Je(N);return false===r?e=false:ve(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Fn.leading=e,Fn.maxWait=+t,Fn.trailing=u,fe(n,t,Fn)},Nn.thru=Qr,Nn.times=function(n,t,r){if(n=su(n),1>n||!Au(n))return[];var e=-1,u=Me(Ou(n,4294967295));for(t=Mt(t,r,1);++e<n;)4294967295>e?u[e]=t(e):t(e);return u},Nn.toArray=xe,Nn.toPlainObject=Ae,Nn.transform=function(n,t,r,e){var u=Ti(n)||we(n);
return t=mr(t,e,4),null==r&&(u||ve(n)?(e=n.constructor,r=u?Ti(n)?new e:[]:Bu($i(e)?e.prototype:null)):r={}),(u?Kn:vt)(n,function(n,e,u){return t(r,n,e,u)}),r},Nn.union=ei,Nn.uniq=Zr,Nn.unzip=Gr,Nn.unzipWith=Jr,Nn.values=Re,Nn.valuesIn=function(n){return Ft(n,ke(n))},Nn.where=function(n,t){return te(n,xt(t))},Nn.without=ui,Nn.wrap=function(n,t){return t=null==t?Fe:t,vr(t,O,null,[n],[])},Nn.xor=function(){for(var n=-1,t=arguments.length;++n<t;){var r=arguments[n];if(Ir(r))var e=e?lt(e,r).concat(lt(r,e)):r;
}return e?$t(e):[]},Nn.zip=ii,Nn.zipObject=Xr,Nn.zipWith=oi,Nn.backflow=Ei,Nn.collect=ee,Nn.compose=Ei,Nn.each=si,Nn.eachRight=pi,Nn.extend=Ni,Nn.iteratee=Ue,Nn.methods=je,Nn.object=Xr,Nn.select=te,Nn.tail=Yr,Nn.unique=Zr,Le(Nn,Nn),Nn.add=function(n,t){return(+n||0)+(+t||0)},Nn.attempt=eo,Nn.camelCase=Xi,Nn.capitalize=function(n){return(n=u(n))&&n.charAt(0).toUpperCase()+n.slice(1)},Nn.clone=function(n,t,r,e){return t&&typeof t!="boolean"&&Cr(n,t,r)?t=false:typeof t=="function"&&(e=r,r=t,t=false),typeof r=="function"?ot(n,t,Mt(r,e,1)):ot(n,t);
},Nn.cloneDeep=function(n,t,r){return typeof t=="function"?ot(n,true,Mt(t,r,1)):ot(n,true)},Nn.deburr=Ie,Nn.endsWith=function(n,t,r){n=u(n),t+="";var e=n.length;return r=r===m?e:Ou(0>r?0:+r||0,e),r-=t.length,0<=r&&n.indexOf(t,r)==r},Nn.escape=function(n){return(n=u(n))&&pn.test(n)?n.replace(cn,a):n},Nn.escapeRegExp=Ee,Nn.every=ne,Nn.find=ai,Nn.findIndex=Xu,Nn.findKey=zi,Nn.findLast=ci,Nn.findLastIndex=Hu,Nn.findLastKey=Bi,Nn.findWhere=function(n,t){return ai(n,xt(t))},Nn.first=Dr,Nn.get=function(n,t,r){
return n=null==n?m:dt(n,Br(t),t+""),n===m?r:n},Nn.gt=ce,Nn.gte=function(n,t){return n>=t},Nn.has=function(n,t){if(null==n)return false;var r=ru.call(n,t);if(!r&&!Wr(t)){if(t=Br(t),n=1==t.length?n:dt(n,Ct(t,0,-1)),null==n)return false;t=Vr(t),r=ru.call(n,t)}return r||Tr(n.length)&&Er(t,n.length)&&(Ti(n)||se(n))},Nn.identity=Fe,Nn.includes=re,Nn.indexOf=Kr,Nn.inRange=function(n,t,r){return t=+t||0,"undefined"===typeof r?(r=t,t=0):r=+r||0,n>=Ou(t,r)&&n<ku(t,r)},Nn.isArguments=se,Nn.isArray=Ti,Nn.isBoolean=function(n){
return true===n||false===n||p(n)&&uu.call(n)==M},Nn.isDate=function(n){return p(n)&&uu.call(n)==P},Nn.isElement=pe,Nn.isEmpty=function(n){return null==n?true:Ir(n)&&(Ti(n)||me(n)||se(n)||p(n)&&$i(n.splice))?!n.length:!Ki(n).length},Nn.isEqual=he,Nn.isError=_e,Nn.isFinite=Ui,Nn.isFunction=$i,Nn.isMatch=function(n,t,r,e){return r=typeof r=="function"?Mt(r,e,3):m,wt(n,xr(t),r)},Nn.isNaN=function(n){return ye(n)&&n!=+n},Nn.isNative=ge,Nn.isNull=function(n){return null===n},Nn.isNumber=ye,Nn.isObject=ve,Nn.isPlainObject=Fi,
Nn.isRegExp=de,Nn.isString=me,Nn.isTypedArray=we,Nn.isUndefined=function(n){return n===m},Nn.kebabCase=Hi,Nn.last=Vr,Nn.lastIndexOf=function(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e;if(typeof r=="number")u=(0>r?ku(e+r,0):Ou(r||0,e-1))+1;else if(r)return u=zt(n,t,true)-1,n=n[u],(t===t?t===n:n!==n)?u:-1;if(t!==t)return s(n,u,true);for(;u--;)if(n[u]===t)return u;return-1},Nn.lt=be,Nn.lte=function(n,t){return n<=t},Nn.max=oo,Nn.min=fo,Nn.noConflict=function(){return h._=iu,this},Nn.noop=ze,Nn.now=wi,
Nn.pad=function(n,t,r){n=u(n),t=+t;var e=n.length;return e<t&&Au(t)?(e=(t-e)/2,t=su(e),e=au(e),r=pr("",e,r),r.slice(0,t)+n+r):n},Nn.padLeft=Qi,Nn.padRight=no,Nn.parseInt=Ce,Nn.random=function(n,t,r){r&&Cr(n,t,r)&&(t=r=null);var e=null==n,u=null==t;return null==r&&(u&&typeof n=="boolean"?(r=n,n=1):typeof t=="boolean"&&(r=t,u=true)),e&&u&&(t=1,u=false),n=+n||0,u?(t=n,n=0):t=+t||0,r||n%1||t%1?(r=Cu(),Ou(n+r*(t-n+hu("1e-"+((r+"").length-1))),t)):It(n,t)},Nn.reduce=yi,Nn.reduceRight=di,Nn.repeat=We,Nn.result=function(n,t,r){
var e=null==n?m:n[t];return e===m&&(null==n||Wr(t,n)||(t=Br(t),n=1==t.length?n:dt(n,Ct(t,0,-1)),e=null==n?m:n[Vr(t)]),e=e===m?r:e),$i(e)?e.call(n):e},Nn.runInContext=d,Nn.size=function(n){var t=n?Zu(n):0;return Tr(t)?t:Ki(n).length},Nn.snakeCase=to,Nn.some=ie,Nn.sortedIndex=ti,Nn.sortedLastIndex=ri,Nn.startCase=ro,Nn.startsWith=function(n,t,r){return n=u(n),r=null==r?0:Ou(0>r?0:+r||0,n.length),n.lastIndexOf(t,r)==r},Nn.sum=function(n,t,r){r&&Cr(n,t,r)&&(t=null);var e=mr(),u=null==t;if(u&&e===it||(u=false,
t=e(t,r,3)),u){for(n=Ti(n)?n:Lr(n),t=n.length,r=0;t--;)r+=+n[t]||0;n=r}else n=Ut(n,t);return n},Nn.template=function(n,t,r){var e=Nn.templateSettings;r&&Cr(n,t,r)&&(t=r=null),n=u(n),t=tt(rt({},r||t),e,nt),r=tt(rt({},t.imports),e.imports,nt);var i,o,f=Ki(r),l=Ft(r,f),a=0;r=t.interpolate||En;var s="__p+='";r=Ze((t.escape||En).source+"|"+r.source+"|"+(r===vn?An:En).source+"|"+(t.evaluate||En).source+"|$","g");var p="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,u,f,l){
return e||(e=u),s+=n.slice(a,l).replace(Cn,c),r&&(i=true,s+="'+__e("+r+")+'"),f&&(o=true,s+="';"+f+";\n__p+='"),e&&(s+="'+((__t=("+e+"))==null?'':__t)+'"),a=l+t.length,t}),s+="';",(t=t.variable)||(s="with(obj){"+s+"}"),s=(o?s.replace(on,""):s).replace(fn,"$1").replace(ln,"$1;"),s="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(i?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+s+"return __p}",t=eo(function(){return De(f,p+"return "+s).apply(m,l);
}),t.source=s,_e(t))throw t;return t},Nn.trim=Se,Nn.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?Cr(e,t,r):null==t)?v(n):i(n,t+"")):n},Nn.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?Cr(e,t,r):null==t)?n.slice(0,g(n)+1):n.slice(0,o(n,t+"")+1):n},Nn.trunc=function(n,t,r){r&&Cr(n,t,r)&&(t=null);var e=C;if(r=W,null!=t)if(ve(t)){var i="separator"in t?t.separator:i,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length,
1>e)return r;if(t=n.slice(0,e),null==i)return t+r;if(de(i)){if(n.slice(e).search(i)){var o,f=n.slice(0,e);for(i.global||(i=Ze(i.source,(jn.exec(i)||"")+"g")),i.lastIndex=0;n=i.exec(f);)o=n.index;t=t.slice(0,null==o?e:o)}}else n.indexOf(i,e)!=e&&(i=t.lastIndexOf(i),-1<i&&(t=t.slice(0,i)));return t+r},Nn.unescape=function(n){return(n=u(n))&&sn.test(n)?n.replace(an,y):n},Nn.uniqueId=function(n){var t=++eu;return u(n)+t},Nn.words=Te,Nn.all=ne,Nn.any=ie,Nn.contains=re,Nn.eq=he,Nn.detect=ai,Nn.foldl=yi,
Nn.foldr=di,Nn.head=Dr,Nn.include=re,Nn.inject=yi,Le(Nn,function(){var n={};return vt(Nn,function(t,r){Nn.prototype[r]||(n[r]=t)}),n}(),false),Nn.sample=ue,Nn.prototype.sample=function(n){return this.__chain__||null!=n?this.thru(function(t){return ue(t,n)}):ue(this.value())},Nn.VERSION=w,Kn("bind bindKey curry curryRight partial partialRight".split(" "),function(n){Nn[n].placeholder=Nn}),Kn(["dropWhile","filter","map","takeWhile"],function(n,t){var r=t!=F,e=t==U;Bn.prototype[n]=function(n,u){var i=this.__filtered__,o=i&&e?new Bn(this):this.clone();
return(o.__iteratees__||(o.__iteratees__=[])).push({done:false,count:0,index:0,iteratee:mr(n,u,1),limit:-1,type:t}),o.__filtered__=i||r,o}}),Kn(["drop","take"],function(n,t){var r=n+"While";Bn.prototype[n]=function(r){var e=this.__filtered__,u=e&&!t?this.dropWhile():this.clone();return r=null==r?1:ku(su(r)||0,0),e?t?u.__takeCount__=Ou(u.__takeCount__,r):Vr(u.__iteratees__).limit=r:(u.__views__||(u.__views__=[])).push({size:r,type:n+(0>u.__dir__?"Right":"")}),u},Bn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse();
},Bn.prototype[n+"RightWhile"]=function(n,t){return this.reverse()[r](n,t).reverse()}}),Kn(["first","last"],function(n,t){var r="take"+(t?"Right":"");Bn.prototype[n]=function(){return this[r](1).value()[0]}}),Kn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");Bn.prototype[n]=function(){return this[r](1)}}),Kn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?xt:Be;Bn.prototype[n]=function(n){return this[r](e(n))}}),Bn.prototype.compact=function(){return this.filter(Fe)},Bn.prototype.reject=function(n,t){
return n=mr(n,t,1),this.filter(function(t){return!n(t)})},Bn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=this;return 0>n?r=this.takeRight(-n):n&&(r=this.drop(n)),t!==m&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r},Bn.prototype.toArray=function(){return this.drop(0)},vt(Bn.prototype,function(n,t){var r=Nn[t];if(r){var e=/^(?:filter|map|reject)|While$/.test(t),u=/^(?:first|last)$/.test(t);Nn.prototype[t]=function(){function t(n){return n=[n],_u.apply(n,i),r.apply(Nn,n)}var i=arguments,o=this.__chain__,f=this.__wrapped__,l=!!this.__actions__.length,a=f instanceof Bn,c=i[0],s=a||Ti(f);
return s&&e&&typeof c=="function"&&1!=c.length&&(a=s=false),a=a&&!l,u&&!o?a?n.call(f):r.call(Nn,this.value()):s?(f=n.apply(a?f:new Bn(this),i),u||!l&&!f.__actions__||(f.__actions__||(f.__actions__=[])).push({func:Qr,args:[t],thisArg:Nn}),new zn(f,o)):this.thru(t)}}}),Kn("concat join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?Qe:Xe)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:join|pop|replace|shift)$/.test(n);Nn.prototype[n]=function(){
var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),vt(Bn.prototype,function(n,t){var r=Nn[t];if(r){var e=r.name;(Lu[e]||(Lu[e]=[])).push({name:t,func:r})}}),Lu[sr(null,x).name]=[{name:"wrapper",func:null}],Bn.prototype.clone=function(){var n=this.__actions__,t=this.__iteratees__,r=this.__views__,e=new Bn(this.__wrapped__);return e.__actions__=n?Dn(n):null,e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=t?Dn(t):null,
e.__takeCount__=this.__takeCount__,e.__views__=r?Dn(r):null,e},Bn.prototype.reverse=function(){if(this.__filtered__){var n=new Bn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Bn.prototype.value=function(){var n=this.__wrapped__.value();if(!Ti(n))return Lt(n,this.__actions__);var t,r=this.__dir__,e=0>r;t=n.length;for(var u=this.__views__,i=0,o=-1,f=u?u.length:0;++o<f;){var l=u[o],a=l.size;switch(l.type){case"drop":i+=a;break;case"dropRight":t-=a;break;case"take":
t=Ou(t,i+a);break;case"takeRight":i=ku(i,t-a)}}t={start:i,end:t},u=t.start,i=t.end,t=i-u,u=e?i:u-1,i=Ou(t,this.__takeCount__),f=(o=this.__iteratees__)?o.length:0,l=0,a=[];n:for(;t--&&l<i;){for(var u=u+r,c=-1,s=n[u];++c<f;){var p=o[c],h=p.iteratee,_=p.type;if(_==U){if(p.done&&(e?u>p.index:u<p.index)&&(p.count=0,p.done=false),p.index=u,!(p.done||(_=p.limit,p.done=-1<_?p.count++>=_:!h(s))))continue n}else if(p=h(s),_==F)s=p;else if(!p){if(_==$)continue n;break n}}a[l++]=s}return a},Nn.prototype.chain=function(){
return Hr(this)},Nn.prototype.commit=function(){return new zn(this.value(),this.__chain__)},Nn.prototype.plant=function(n){for(var t,r=this;r instanceof Ln;){var e=Mr(r);t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},Nn.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Bn?(this.__actions__.length&&(n=new Bn(this)),new zn(n.reverse(),this.__chain__)):this.thru(function(n){return n.reverse()})},Nn.prototype.toString=function(){return this.value()+""},Nn.prototype.run=Nn.prototype.toJSON=Nn.prototype.valueOf=Nn.prototype.value=function(){
return Lt(this.__wrapped__,this.__actions__)},Nn.prototype.collect=Nn.prototype.map,Nn.prototype.head=Nn.prototype.first,Nn.prototype.select=Nn.prototype.filter,Nn.prototype.tail=Nn.prototype.rest,Nn}var m,w="3.9.3",b=1,x=2,A=4,j=8,k=16,O=32,R=64,I=128,E=256,C=30,W="...",S=150,T=16,U=0,$=1,F=2,N="Expected a function",L="__lodash_placeholder__",z="[object Arguments]",B="[object Array]",M="[object Boolean]",P="[object Date]",q="[object Error]",D="[object Function]",K="[object Number]",V="[object Object]",Y="[object RegExp]",Z="[object String]",G="[object ArrayBuffer]",J="[object Float32Array]",X="[object Float64Array]",H="[object Int8Array]",Q="[object Int16Array]",nn="[object Int32Array]",tn="[object Uint8Array]",rn="[object Uint8ClampedArray]",en="[object Uint16Array]",un="[object Uint32Array]",on=/\b__p\+='';/g,fn=/\b(__p\+=)''\+/g,ln=/(__e\(.*?\)|\b__t\))\+'';/g,an=/&(?:amp|lt|gt|quot|#39|#96);/g,cn=/[&<>"'`]/g,sn=RegExp(an.source),pn=RegExp(cn.source),hn=/<%-([\s\S]+?)%>/g,_n=/<%([\s\S]+?)%>/g,vn=/<%=([\s\S]+?)%>/g,gn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,yn=/^\w*$/,dn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,mn=/[.*+?^${}()|[\]\/\\]/g,wn=RegExp(mn.source),bn=/[\u0300-\u036f\ufe20-\ufe23]/g,xn=/\\(\\)?/g,An=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,jn=/\w*$/,kn=/^0[xX]/,On=/^\[object .+?Constructor\]$/,Rn=/^\d+$/,In=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,En=/($^)/,Cn=/['\n\r\u2028\u2029\\]/g,Wn=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Sn=" \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",Tn="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout document isFinite parseFloat parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap window".split(" "),Un={};
Un[J]=Un[X]=Un[H]=Un[Q]=Un[nn]=Un[tn]=Un[rn]=Un[en]=Un[un]=true,Un[z]=Un[B]=Un[G]=Un[M]=Un[P]=Un[q]=Un[D]=Un["[object Map]"]=Un[K]=Un[V]=Un[Y]=Un["[object Set]"]=Un[Z]=Un["[object WeakMap]"]=false;var $n={};$n[z]=$n[B]=$n[G]=$n[M]=$n[P]=$n[J]=$n[X]=$n[H]=$n[Q]=$n[nn]=$n[K]=$n[V]=$n[Y]=$n[Z]=$n[tn]=$n[rn]=$n[en]=$n[un]=true,$n[q]=$n[D]=$n["[object Map]"]=$n["[object Set]"]=$n["[object WeakMap]"]=false;var Fn={leading:false,maxWait:0,trailing:false},Nn={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A",
"\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u",
"\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"},Ln={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},zn={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'","&#96;":"`"},Bn={"function":true,object:true},Mn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Pn=Bn[typeof exports]&&exports&&!exports.nodeType&&exports,qn=Bn[typeof module]&&module&&!module.nodeType&&module,Dn=Bn[typeof self]&&self&&self.Object&&self,Kn=Bn[typeof window]&&window&&window.Object&&window,Vn=qn&&qn.exports===Pn&&Pn,Yn=Pn&&qn&&typeof global=="object"&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||Dn||this,Zn=d();
typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Yn._=Zn, define(function(){return Zn})):Pn&&qn?Vn?(qn.exports=Zn)._=Zn:Pn._=Zn:Yn._=Zn}).call(this);

1
public/vendor/visibility-1.2.1.min.js vendored Normal file
View file

@ -0,0 +1 @@
!function(e){"use strict";var i=-1,t={onVisible:function(e){var i=t.isSupported();if(!i||!t.hidden())return e(),i;var n=t.change(function(){t.hidden()||(t.unbind(n),e())});return n},change:function(e){if(!t.isSupported())return!1;i+=1;var n=i;return t._callbacks[n]=e,t._listen(),n},unbind:function(e){delete t._callbacks[e]},afterPrerendering:function(e){var i=t.isSupported(),n="prerender";if(!i||n!=t.state())return e(),i;var r=t.change(function(i,d){n!=d&&(t.unbind(r),e())});return r},hidden:function(){return!(!t._doc.hidden&&!t._doc.webkitHidden)},state:function(){return t._doc.visibilityState||t._doc.webkitVisibilityState||"visible"},isSupported:function(){return!(!t._doc.visibilityState&&!t._doc.webkitVisibilityState)},_doc:document||{},_callbacks:{},_change:function(e){var i=t.state();for(var n in t._callbacks)t._callbacks[n].call(t._doc,e,i)},_listen:function(){if(!t._init){var e="visibilitychange";t._doc.webkitVisibilityState&&(e="webkit"+e);var i=function(){t._change.apply(t,arguments)};t._doc.addEventListener?t._doc.addEventListener(e,i):t._doc.attachEvent(e,i),t._init=!0}}};"undefined"!=typeof module&&module.exports?module.exports=t:e.Visibility=t}(this),function(e){"use strict";var i=-1,t=function(t){return t.every=function(e,n,r){t._time(),r||(r=n,n=null),i+=1;var d=i;return t._timers[d]={visible:e,hidden:n,callback:r},t._run(d,!1),t.isSupported()&&t._listen(),d},t.stop=function(e){return t._timers[e]?(t._stop(e),delete t._timers[e],!0):!1},t._timers={},t._time=function(){t._timed||(t._timed=!0,t._wasHidden=t.hidden(),t.change(function(){t._stopRun(),t._wasHidden=t.hidden()}))},t._run=function(i,n){var r,d=t._timers[i];if(t.hidden()){if(null===d.hidden)return;r=d.hidden}else r=d.visible;var a=function(){d.last=new Date,d.callback.call(e)};if(n){var o=new Date,u=o-d.last;r>u?d.delay=setTimeout(function(){a(),d.id=setInterval(a,r)},r-u):(a(),d.id=setInterval(a,r))}else d.id=setInterval(a,r)},t._stop=function(e){var i=t._timers[e];clearInterval(i.id),clearTimeout(i.delay),delete i.id,delete i.delay},t._stopRun=function(){var e=t.hidden(),i=t._wasHidden;if(e&&!i||!e&&i)for(var n in t._timers)t._stop(n),t._run(n,!e)},t};"undefined"!=typeof module&&module.exports?module.exports=t(require("./visibility.core")):t(e.Visibility)}(window);

View file

@ -1,6 +1,8 @@
<script src="/vendor/spin.min.js" defer></script> <script src="/vendor/spin.min.js" defer></script>
<script src="/vendor/jquery-1.11.2.min.js" defer></script> <script src="/vendor/jquery-1.11.2.min.js" defer></script>
<script src="/vendor/bootstrap/js/bootstrap.min.js" defer></script> <script src="/vendor/bootstrap/js/bootstrap.min.js" defer></script>
<script src="/vendor/greensock-js/TweenMax.min.js" defer></script>
<script src="/vendor/greensock-js/jquery.gsap.min.js" defer></script>
<!--codemirror--> <!--codemirror-->
<script src="/vendor/codemirror/codemirror.min.js" defer></script> <script src="/vendor/codemirror/codemirror.min.js" defer></script>
<script src="/vendor/inlineAttachment/inline-attachment.js" defer></script> <script src="/vendor/inlineAttachment/inline-attachment.js" defer></script>
@ -17,12 +19,16 @@
<script src="/vendor/emojify/js/emojify.js" defer></script> <script src="/vendor/emojify/js/emojify.js" defer></script>
<script src="/vendor/to-markdown.js" defer></script> <script src="/vendor/to-markdown.js" defer></script>
<script src="/vendor/raphael-min.js" defer></script> <script src="/vendor/raphael-min.js" defer></script>
<script src="/vendor/underscore-min.js" defer></script> <script src="/vendor/lodash.min.js" defer></script>
<script src="/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script> <script src="/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
<script src="/vendor/flowchart/flowchart-1.4.0.min.js" defer></script> <script src="/vendor/flowchart/flowchart-1.4.0.min.js" defer></script>
<script src="/vendor/FileSaver.min.js" defer></script> <script src="/vendor/FileSaver.min.js" defer></script>
<script src="/vendor/store.min.js" defer></script> <script src="/vendor/store.min.js" defer></script>
<script src="/vendor/url.min.js" defer></script> <script src="/vendor/url.min.js" defer></script>
<script src="/vendor/jquery-textcomplete/jquery.textcomplete.js" defer></script>
<script src="/vendor/idle.js" defer></script>
<script src="/vendor/visibility-1.2.1.min.js" defer></script>
<script src="/vendor/list.min.js" defer></script>
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="rdoizrlnkuha23r" async defer></script> <script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="rdoizrlnkuha23r" async defer></script>
<script type="text/x-mathjax-config"> <script type="text/x-mathjax-config">
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }}); MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});

View file

@ -20,7 +20,7 @@
<link rel="stylesheet" href="/css/github-extract.css"> <link rel="stylesheet" href="/css/github-extract.css">
<link rel="stylesheet" href="/css/gist.css"> <link rel="stylesheet" href="/css/gist.css">
<link rel="stylesheet" href="/vendor/highlight-js/github.min.css"> <link rel="stylesheet" href="/vendor/highlight-js/github.min.css">
<link rel="stylesheet" href="/vendor/emojify/css/emojify.min.css" /> <link rel="stylesheet" href="/vendor/emojify/css/emojify.min.css">
<link rel="stylesheet" href="/css/markdown.css"> <link rel="stylesheet" href="/css/markdown.css">
<link rel="stylesheet" href="/css/index.css"> <link rel="stylesheet" href="/css/index.css">
<link rel="stylesheet" href="/css/extra.css"> <link rel="stylesheet" href="/css/extra.css">

View file

@ -1,4 +1,4 @@
<nav class="hidden-print navbar navbar-default navbar-fixed-top"> <nav class="hidden-print navbar navbar-default navbar-fixed-top unselectable">
<!-- Brand and toggle get grouped for better mobile display --> <!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header"> <div class="navbar-header">
<h4 class="pull-right" style="margin-top: 17px; color: #777;"> <h4 class="pull-right" style="margin-top: 17px; color: #777;">
@ -7,9 +7,11 @@
<div class="visible-md">&nbsp;</div> <div class="visible-md">&nbsp;</div>
<div class="visible-lg">&nbsp;</div> <div class="visible-lg">&nbsp;</div>
</h4> </h4>
<div class="nav-mobile nav-status visible-xs"> <div class="nav-mobile nav-status visible-xs" id="short-online-user-list">
<div class="ui-short-status"><span class="label label-danger"><i class="fa fa-plug"></i></span> <a class="ui-short-status" data-target="#" data-toggle="dropdown"><span class="label label-danger"><i class="fa fa-plug"></i> </span>
</div> </a>
<ul class="dropdown-menu list" role="menu" aria-labelledby="menu">
</ul>
</div> </div>
<a class="navbar-brand" href="./"><i class="fa fa-file-text"></i> HackMD</a> <a class="navbar-brand" href="./"><i class="fa fa-file-text"></i> HackMD</a>
<div class="nav-mobile pull-right visible-xs"> <div class="nav-mobile pull-right visible-xs">
@ -62,44 +64,44 @@
</a> </a>
</ul> </ul>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li> <li id="online-user-list">
<a> <a class="ui-status" data-target="#" data-toggle="dropdown">
<div class="ui-status">
<span class="label label-danger"><i class="fa fa-plug"></i> OFFLINE</span> <span class="label label-danger"><i class="fa fa-plug"></i> OFFLINE</span>
</div>
</a> </a>
<ul class="dropdown-menu list" role="menu" aria-labelledby="menu" style="right: 15px;width: 200px;">
</ul>
</li> </li>
</ul> </ul>
<div class="navbar-form navbar-right" style="padding:0;"> <ul class="nav navbar-nav navbar-right" style="padding:0;">
<a href="./new" target="_blank" class="btn btn-link ui-new"> <li>
<a href="./new" target="_blank" class="ui-new">
<i class="fa fa-plus"></i> New <i class="fa fa-plus"></i> New
</a> </a>
<a href="#" target="_blank" class="btn btn-link ui-pretty"> </li>
<li>
<a href="#" target="_blank" class="ui-pretty">
<i class="fa fa-share-alt"></i> Share <i class="fa fa-share-alt"></i> Share
</a> </a>
<span> </li>
<a class="btn btn-link" data-target="#" data-toggle="dropdown"> <li>
Save <i class="fa fa-caret-down"></i> <a data-target="#" data-toggle="dropdown">
Menu <i class="fa fa-caret-down"></i>
</a> </a>
<ul class="dropdown-menu" role="menu" aria-labelledby="menu" style="right: 230px;"> <ul class="dropdown-menu" role="menu" aria-labelledby="menu">
<li class="dropdown-header">Save</li>
<li role="presentation"><a role="menuitem" class="ui-save-dropbox" tabindex="-1" href="#" target="_self"><i class="fa fa-dropbox fa-fw"></i> Dropbox</a> <li role="presentation"><a role="menuitem" class="ui-save-dropbox" tabindex="-1" href="#" target="_self"><i class="fa fa-dropbox fa-fw"></i> Dropbox</a>
</li> </li>
<li role="presentation"><a role="menuitem" class="ui-download-markdown" tabindex="-1" href="#" target="_self"><i class="fa fa-file-text fa-fw"></i> Markdown</a> <li role="presentation"><a role="menuitem" class="ui-download-markdown" tabindex="-1" href="#" target="_self"><i class="fa fa-file-text fa-fw"></i> Markdown</a>
</li> </li>
</ul> <li class="divider"></li>
</span> <li class="dropdown-header">Import</li>
<span>
<a class="btn btn-link" data-target="#" data-toggle="dropdown">
Import <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="menu" style="right: 150px;">
<li role="presentation"><a role="menuitem" class="ui-import-dropbox" tabindex="-1" href="#" target="_self"><i class="fa fa-dropbox fa-fw"></i> Dropbox</a> <li role="presentation"><a role="menuitem" class="ui-import-dropbox" tabindex="-1" href="#" target="_self"><i class="fa fa-dropbox fa-fw"></i> Dropbox</a>
</li> </li>
<li role="presentation"><a role="menuitem" class="ui-import-clipboard" href="#" data-toggle="modal" data-target="#clipboardModal"><i class="fa fa-clipboard fa-fw"></i> Clipboard</a> <li role="presentation"><a role="menuitem" class="ui-import-clipboard" href="#" data-toggle="modal" data-target="#clipboardModal"><i class="fa fa-clipboard fa-fw"></i> Clipboard</a>
</li> </li>
</ul> </ul>
</span> </li>
</div> </ul>
</div> </div>
</nav> </nav>
<div class="ui-spinner"></div> <div class="ui-spinner"></div>

View file

@ -38,7 +38,7 @@
<script src="<%- url %>/vendor/highlight-js/highlight.min.js" defer></script> <script src="<%- url %>/vendor/highlight-js/highlight.min.js" defer></script>
<script src="<%- url %>/vendor/emojify/js/emojify.min.js" defer></script> <script src="<%- url %>/vendor/emojify/js/emojify.min.js" defer></script>
<script src="<%- url %>/vendor/raphael-min.js" defer></script> <script src="<%- url %>/vendor/raphael-min.js" defer></script>
<script src="<%- url %>/vendor/underscore-min.js" defer></script> <script src="<%- url %>/vendor/lodash.min.js" defer></script>
<script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script> <script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
<script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js" defer></script> <script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js" defer></script>
<script type="text/x-mathjax-config"> <script type="text/x-mathjax-config">

1
run.sh
View file

@ -1,3 +1,4 @@
#!/bin/bash
forever stop hackmd forever stop hackmd
DATABASE_URL='change this' \ DATABASE_URL='change this' \
MONGOLAB_URI='change this' \ MONGOLAB_URI='change this' \